struct als Member einer Klasse
-
Nabend zusammen,
ich stehe mal wieder vor einem Problem: Es geht darum Variablen einer Klasse als struct zusammenzufassen. Versucht habe ich das etwa so:
Klassendeklaration
class Klasse { public: Klasse();//Konstruktor struct Data { int v1; int v2; //usw }; };Implementation:
Klasse::Klasse() { Data d; //Neues Strukturfeld anlegen d.v1 = 5; //Daten reinpacken };Versucht zu benutzen hab ich das ganze dann so:
//... Klasse Instanz01; //Neue Instanz von 'Klasse' anlegen cout << Instanz01.d.v1; //Wert von v1 ausgeben //...Der Fehler den ich erhalte ist folgender:
'class Klasse' has no member named 'd'Ich code mit Code::Blocks, der Compiler ist GCC/MinGW
Vielleicht weiß ja jemand woran das liegt und kann einen Tipp geben...
Vielen Dank und einen schönen Abend,PixelRealm
-
wie der kompiler schon sagt:
die klasse hat kein member namens d.Das was du da im Konstruktor angelegt hast ist eine automatische (auf dem stack) Variable, die beim Verlassen des Konstruktors ihre Gültigkeit verliert.
Wenn deine Klasse ein member d haben soll, musst du das auch da deklarieren.
class Klasse { public: Klasse();//Konstruktor struct Data { int v1; int v2; //usw }; Data d; };Edit:
eigendlich sollte hier ein compiler sogar warnen, da du im konstruktor eine Variable definierst, die gar nicht ausgelesen wird.
Überprüfe mal das warning level deines compilers
-
PixelRealm schrieb:
ich stehe mal wieder vor einem Problem: Es geht darum Variablen einer Klasse als struct zusammenzufassen. Versucht habe ich das etwa so:
Du solltest dich nochmal mit dem Thema Scope auseinander setzen. Wenn du etwas Objektweit verwenden willst, musst du dies auch in der Klassendeklaration angeben:
Klassendeklaration
class Klasse { //... // Anmerkung: Datenkapselung wäre auch mal ein sinnvolles Thema ;) Data d; // Membervariable: Gilt für die Instanz der Klasse };Implementation:
Klasse::Klasse() { // Data d; <--- Dies wäre eine lokale Variable, sprich nur in dieser // Methode gültig d.v1 = 5; // Besser wäre es in dem Fall der Struktur einen Konstruktor zu // geben und die Initialisierungsliste des Konstruktors zu // verwenden... };Nun würde der Zugriff auch klappen (Wenn gleich mit Verstoß gegen das Geheimhaltungsprinzip [Datenkapselung]).
cu André
-
Du deklarierst nur eine Klasse (Struktur) innerhalb deiner Klasse, legst aber keine Membervariable dieser inneren Klasse an. Stattdessen erzeugst du im Konstruktor eine lokale Variable, die eine Instanz der inneren Klasse ist. Wie gesagt scheinst du aber eine Membervariable haben zu wollen, also sowas:
class Klasse { public: Klasse();//Konstruktor struct Data { int v1; int v2; //usw }; //NEU: Data d; };Der Konstruktor sieht dann zum Beispiel so aus (besser wäre es natürlich, einen Konstruktor für Data zu schreiben und den dann mit einer Initialisierungsliste zu verwenden):
Klasse::Klasse() { d.v1 = 5; //Daten reinpacken };EDIT: Zu spät, wurde alles (und noch viel mehr) schon gesagt

Felix
-
nur eine kleine anmerkung zur terminologie: worum es hier geht sind klassendefinitionen, nicht klassendeklarationen.
-
Oh, stimmt... Normalerweise hätte mir das auch auffallen müssen, statt dessen habe ich es sogar selbst falsch gemacht

Felix
-
ansich logisch was ihr sagt...

Jetzt klappt alles, vielen Dank!
Tobi