Funktioniert diese C++ Klasse?

2 Antworten

Hi, mein Problem ist eher, ob man ein struct in eine Klasse aufrufen darf.

Du kannst ein struct innerhalb einer Klasse definieren und du kannst es auch innerhalb der Klasse benutzen.

Würde die Klasse so funktionieren?

Nein. Innerhalb deiner Methoden verwendest du Variablen, die nicht existieren und einige Methoden mit Rückgabetyp liefern keinen Wert.

Du wolltest sicherlich die Felder des struct verwenden. Die Setter-Methoden sollten auch mit dem Präfix set beginnen.

Beispiel:

float getY() {
  return rect.y;
}

void setY(float yNewValue) {
  rect.y = yNewValue;
}
BONEz851 
Fragesteller
 11.09.2023, 12:46

Danke dir. ich habe die mal überarbeitet: #pragma once

#include <string>

  struct Rect

  {

    char name;

    float x;

    float y;

    float width;

    float height;

   

  std::string label;

public:

  char getname() {

    return name;

  }

  char setname(char nameNewValue) {

    name = nameNewValue;

  }

  float getx() {

    return rect.x;

  }

  void setx(float xNewValue) {

    rect.x = xNewValue;

  }

  float getY() {

    return rect.y;

  }

  void setY(float yNewValue) {

    rect.y = yNewValue;

  }

  float getwidth() {

    return rect.width;

  }

  void setwidth(float widthNewValue) {

    rect.width = widthNewValue;

  }

  float getheight() {

    return rect.height;

  }

  void setheight(float heightNewValue) {

    rect.height = heightNewValue;

  }

  } rect;

0
regex9  11.09.2023, 14:58
@BONEz851

Du scheinst deinen Code aber nicht wirklich zu testen.

Du hast deinen Code nun auf eine einzige struct-Definition umgeändert, von der eine Instanz (namens rect) angelegt wird. Das kannst du so machen. Allerdings solltest du beachten, dass rect innerhalb der struct-Definition nicht bekannt ist. Innerhalb des struct kannst du über die Feldnamen auf dessen Felder zugreifen.

Beispiel:

struct Rect {
  float x;

  void setX(float newX) {
    x = newX;
  }
}

Des Weiteren verlangt die setname-Methode immer noch einen expliziten Rückgabetyp, obwohl sie nichts zurückgeben, sondern nur einen Feldwert setzen soll.

Im Bezug auf die Methodennamen empfehle ich die Kamelhöckerschreibweise, so wie du sie bereits bei deinen Parameternamen einsetzt (Bsp.:getWidth, getHeight, ...). Das macht es einfacher, den Code zu lesen.

1
ob man ein struct in eine Klasse aufrufen darf.

Ich weiß nicht, was du hier fragst. Man kann ein struct nicht "aufrufen".

Ein struct kann aber eigentlich genau dasselbe wie eine class. Du kannst also Methoden hinzufügen, Konstruktoren, friend-Funktionen....

Der wesentliche Unterschied: die Default-Sichtbarkeit in einem struct ist public.

Dein Code wird jedenfalls nicht so funktionieren. Die Felder des struct werden nicht automatisch Felder der umschließenden Klasse. getwidth() etwa kann so nicht klappen: es gibt kein Feld namens width in der Klasse Button.

Außerdem nennst du deine Setter ebenfalls "get...", was mit den bereits definierten Settern kollidiert, du deklarierst sie mit einem nichtexistenten Rückgabewert...

BONEz851 
Fragesteller
 11.09.2023, 12:20

ich kriege diese 8 Fehler Meldungen

Fehler (aktiv) E0020 Der Bezeichner ""width"" ist nicht definiert

Fehler (aktiv) E0020 Der Bezeichner ""height"" ist nicht definiert.

Fehler (aktiv) E0020 Der Bezeichner ""height"" ist nicht definiert.

Fehler (aktiv) E0020 Der Bezeichner ""width"" ist nicht definiert

Fehler (aktiv) E0020 Der Bezeichner ""x"" ist nicht definiert.

Fehler (aktiv) E0020 Der Bezeichner ""x"" ist nicht definiert.

Fehler (aktiv) E0020 Der Bezeichner ""y"" ist nicht definiert.

Fehler (aktiv) E0020 Der Bezeichner ""y"" ist nicht definiert.

0
jo135  11.09.2023, 12:21
@BONEz851

Natürlich. Weil die Klasse Button, auf der du die Getter definiert hast, diese Felder gar nicht enthält. Sie enthält ein Feld rect vom Typ Rect, das wiederum diese Felder hat.

0
BONEz851 
Fragesteller
 11.09.2023, 12:22
@jo135

Soll ich dann class entfernen oder struct?

0
jo135  11.09.2023, 12:26
@BONEz851

Ich weiß nicht, was du erreichen willst.

Wenn du in den Methoden von Button die Felder von rect referenzieren willst, dann z.B. mit

rect.x
rect.y
rect.width

usw.

Und dann schau dir deine Setter nochmal genau an - die ergeben überhaupt keinen Sinn, angefangen beim Namen.

Bei den Semikolons kannst du auch ausmisten. Du brauchst sie nicht nach einer Methodendefinition, z.B.

0