struct innerhalb einer Klasse
![](/uploads/default_avatar/thumb/missing.png)
- programmiertechnik
Hi,
ich stehe momentan vor einem Problem, ds ich bisher nicht hatte.
Innerhalb einer Klasse habe ich eine Struktur. Jetzt will ich ausserhalb der Klasse auf die Elemente der Struktur zugreifen. Das ganze unter C++ (Linux 2.6, sollte aber in dem Fall egal sein, da es ISO-C++ ist, soweit ich weiss)
Die Werte sind in der STruktur vorhanden, innerhalb der Klasse kann ich darauf zugreifen.
cout << klasse.struktur[0].element << endl;
Funktioniert leider nicht. Irgendwo logisch, da struktur[0] nur innerhalb der Klasse existiert. Aber wie greif ich jetzt auf die Elemente der Struktur zu?
Wenn das schlechter Programierstil ist (ein struct ist ja fast identisch mit class), bitte ich um einen entsprechenden Hinweis, dann werd ich mir ne andere Lösung überlegen.
thx4hlp
Gruss
Manuel
Moin Manuel,
ich stehe momentan vor einem Problem, ds ich bisher nicht hatte.
Innerhalb einer Klasse habe ich eine Struktur. Jetzt will ich ausserhalb der Klasse auf die Elemente der Struktur zugreifen. Das ganze unter C++ (Linux 2.6, sollte aber in dem Fall egal sein, da es ISO-C++ ist, soweit ich weiss)Die Werte sind in der STruktur vorhanden, innerhalb der Klasse kann ich darauf zugreifen.
cout << klasse.struktur[0].element << endl;
Funktioniert leider nicht. Irgendwo logisch, da struktur[0] nur innerhalb der Klasse existiert. Aber wie greif ich jetzt auf die Elemente der Struktur zu?
das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung und so das richtige Forum für solche Probleme ist es eigentlich auch nicht.
Ich vermute mal, dass du die Struktur oder die Instanz der Struktur nicht public gemacht hast.
Wenn das schlechter Programierstil ist (ein struct ist ja fast identisch mit class), bitte ich um einen entsprechenden Hinweis, dann werd ich mir ne andere Lösung überlegen.
Warum sollte das schlechter Programmierstil sein? Ich verwende struct zum Beispiel immer dann, wenn ich viele Eigenschaften in ein Objekt verpacken will/muss, aber keine Methoden benötigte, während bei mir in Klassen grundsätzlich alle Attribute protected sind und der Zugriff ausschließlich über get...- und set...-Methoden erfolgt. (Ausnahmen bestätigen die Regel.)
Claus
Hallo Claus,
das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung und so das richtige Forum für solche Probleme ist es eigentlich auch nicht.
a) Es gibt eventuell keine wirkliche Fehlermeldung.
b) Hier im Forum darf man auch über Vogelgrippe diskutieren, was
noch mehr off-topic ist, also ist doch etwas OO nicht so schlimm?
Manuel, wenn du das struct auch von anderen Komponenten/Klassen aus
benutzen willst, dann solltest du dessen Typeninformation öffentlich
machen. Oder du erweiterst die umgebende Klasse mit Funktionen, die
die Struktur bedienen können.
Von schlechtem Programmierstil würde ich (auch) nicht sprechen.
Zumindest nicht pauschal. :)
Adé,
Frank
Moin Frank,
das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung und so das richtige Forum für solche Probleme ist es eigentlich auch nicht.
a) Es gibt eventuell keine wirkliche Fehlermeldung.
Aha!
Was ist denn eine unwirkliche Fehlermeldung, oder was meinst du mit "keine wirkliche"?
Was passiert dann, wenn es keine Fehlermeldung gibt?
Entweder liegt sein Problem, darin, dass - wie wir beide vermuten - er keine Zugriffsrechte hat, dann bekommt er eine Fehlermeldung vom Compiler. Oder es funktioniert anders als er erwartet. Dagegen spricht aber, dass es aus der Klasse heraus funktioniert. Ergo: Fehlermeldung.
b) Hier im Forum darf man auch über Vogelgrippe diskutieren, was
noch mehr off-topic ist, also ist doch etwas OO nicht so schlimm?
Natürlich ist das nicht schlimm. Ich wollte nur darauf hinweisen, das er mit seinem Problem in einem anderen Forum vielleicht besser aufgehoben ist, da er dort kompetenter beraten werden kann. Er möchte schließlich Hilfe und nicht über Vogelgrippe labern.
Manuel, wenn du das struct auch von anderen Komponenten/Klassen aus
benutzen willst, dann solltest du dessen Typeninformation öffentlich
machen.
Sag' ich doch.
Claus
Hallo,
dein Hinweis auf dieses Forum als nicht unbedingter bester Platz für
die Frage, war ja auch für mich nicht sooo daneben. Aber es gibt hier
sicherlich genügend Leute, die sich mit OO befassen und Hilfestellung
leisten könn(t)en.
Was ist denn eine unwirkliche Fehlermeldung, oder was meinst du mit "keine wirkliche"?
Was passiert dann, wenn es keine Fehlermeldung gibt?
Wenn ich soetwas versuche in MS Visual Studio, sagt mir das
IntelliSense(r) quasi durch die Blume dass es nicht geht, indem
das Feld gar nicht angeboten wird. ("unwirklicher Fehler" ;))
Wenn ich es dennoch versuche, macht mir der Compiler einen Strich
durch die Rechnung. Das wäre dann wieder der "wirkliche" Fehler. ;)
Dagegen spricht aber, dass es aus der Klasse heraus funktioniert.
Ist ja auch zu erwarten, dächte ich, da das Struct im Kontext der
umgebenden Klasse deklariert wurde, allerdings eben nicht öffentlich.
Adé,
Frank
Hallo Frank,
a) Es gibt eventuell keine wirkliche Fehlermeldung.
wenn ein Zugriff auf eine Datenstruktur versucht wird, gibt es entweder den Zugriff oder eine Fehlermeldung beim Zugriff.
Manuel, wenn du das struct auch von anderen Komponenten/Klassen aus
benutzen willst, dann solltest du dessen Typeninformation öffentlich
machen.
Das finde ich nicht gut im Sinne von OOP.
Oder du erweiterst die umgebende Klasse mit Funktionen, die
die Struktur bedienen können.
Das finde ich gut. :-)
Von schlechtem Programmierstil würde ich (auch) nicht sprechen.
Zumindest nicht pauschal. :)
Ich fand den Wunsch von Manuel verständlich aber eher weniger der Philosophie von OOP entsprechend.
LG, Michael Niebuhr
Hi nochmal,
der AP schrieb ja explizit nochmal in https://forum.selfhtml.org/?t=124283&m=800722
Fehlermeldung kommt keine
Das finde ich nicht gut im Sinne von OOP.
Das finde ich gut. :-)
Wenn er das Struct _nur_ innerhalb der Klasse selbst brauch um Daten
abzulegen, und externe Konsumenten arbeiten dann nur mit Untermengen/
Bruchteilen des Structs, gebe ich dir recht, dann sollten oder brauchen
die Typen-Informationen des Structs nicht öffentlich zu sein.
Wenn externe Konsumenten allerdings mit dem Struct an sich ebenfalls
vollständig arbeiten wollen (also z.b. auch erzeugen) dann wäre eine
öffentliche(re) Deklaration durchaus in Betracht zu ziehen.
Keine Ahnung, was der OP genau will :)
Adé
Frank
Hi,
Wenn er das Struct _nur_ innerhalb der Klasse selbst brauch um Daten
abzulegen, und externe Konsumenten arbeiten dann nur mit Untermengen/
Bruchteilen des Structs, gebe ich dir recht, dann sollten oder brauchen
die Typen-Informationen des Structs nicht öffentlich zu sein.
gut.
Wenn externe Konsumenten allerdings mit dem Struct an sich ebenfalls
vollständig arbeiten wollen (also z.b. auch erzeugen) dann wäre eine
öffentliche(re) Deklaration durchaus in Betracht zu ziehen.
Sorry, ich weiss, dass bestimmte Sprachen so etwas zulassen, aber das wäre dennoch eine "krasse" OOP-Sünde.
Schönen Abend noch,
Freischwimmer
Moin Manuel,
Hi,
das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung.
Fehlermeldung kommt keine, nur ist der Wert in der int main() nicht verfügbar.
class Device{
public:
Device(char* devicelist);
~Device();
int device_number;
const char* id[];
struct device_data{
const char* name;
const char* description;
const char* filename;
} *p_device;
private:
ezxml_t DeviceList(char* device_list);
std::string devices_e;
char devices_c[];
};
Ich vermute mal, dass du die Struktur oder die Instanz der Struktur nicht public gemacht hast.
Die Struktur ist also Public.
if(device[device_counter].name = ezxml_attr(attribute_list, "id"));
(Wobei "device_counter" über eine for()-Schleife erhöht wird)
Jetzt kann ich innerhalb der Klasse auf device[0].name zugreifen.
Wenn ich allerdings aus der int main() auf diesen Wert zugreifen will:
Device dev(devicefile);
cout << dev.device[0].name << endl;
Kommt die Meldung, das "device" kein Member der Klasse Device ist. Wenn ich per *p_device zugreifen will, klappt es auch nicht.
Insgesammt will ich ein Array in der Klasse erzeugen, auf dessen Werte ich in der main() zugreifen kann. Mit Werten ausserhalb der Struktur klappt es ja auch ;)
Bisher hatte ich noch nie eine STruktur innerhalb einer Klasse, deshalb ist das ein problem für mich, und ich komm einfach nicht weiter :(
Hi,
class Device{
public:
Device(char* devicelist);
~Device();int device_number;
const char* id[];struct device_data{
const char* name;
const char* description;
const char* filename;
} *p_device;private:
ezxml_t DeviceList(char* device_list);
std::string devices_e;
char devices_c[];
};
if(device[device_counter].name = ezxml_attr(attribute_list, "id"));
Device dev(devicefile);
cout << dev.device[0].name << endl;
Kommt die Meldung, das "device" kein Member der Klasse Device ist.
Wundert Dich das? Du hast ja nirgends ein Member mit diesem Namen deklariert.
Wenn ich per *p_device zugreifen will, klappt es auch nicht.
Wie hast Du das genau gemacht?
Wenn mich mein etwas eingerostetes C++ nicht täuscht:
dev.p_device ist ein Pointer auf Dein struct, also müßte (dev.p_device)->name
cu,
Andreas
Hallo Andreas,
Wenn mich mein etwas eingerostetes C++ nicht täuscht:
dev.p_device ist ein Pointer auf Dein struct, also müßte (dev.p_device)->name
Die Klammern können hier auch weggelassen werden, was aber noch interessant ist: dev.p_device muss natürlich vorher initialisiert werden. Es wird ja in der Klassendefinition nur der Pointer deklariert, es wird keine Struktur erstellt. Im Konstruktor oder irgendwo sonst, wo's sinnig ist, müsste per new der Speicher alloziert werden. Sonst zeigt (ich kenne die C++-Sprachspezifikation nicht auswendig) der Zeiger entweder auf NULL oder er ist komplett undefiniert (d.h. da könnte alle mögliche unsinnige drinstehen, das komplett zufällig ist).
Viele Grüße,
Christian
Hi,
dev.p_device ist ein Pointer auf Dein struct, also müßte (dev.p_device)->name
Die Klammern können hier auch weggelassen werden,
Mag sein. Ich halte mich da eher an die Regel "if in doubt, use them".
Sonst zeigt (ich kenne die C++-Sprachspezifikation nicht auswendig) der Zeiger entweder auf NULL oder er ist komplett undefiniert (d.h. da könnte alle mögliche unsinnige drinstehen, das komplett zufällig ist).
AFAIR sind in C++ keine Default-Initialisierungen vorgesehen (in C wird keine Default-Initialisierung vorgenommen, und C++ hat das vermutlich übernommen). Hab aber schon einige Jahre nichts mehr mit C++ gemacht, bin derzeit eher mit Java am Werkeln (da ist es so, daß Referenzen mit null und int/float usw. mit 0 vorbelegt sind).
Viele Grüße,
Christian
cu,
Andreas
Hallo Andreas,
Wenn mich mein etwas eingerostetes C++ nicht täuscht:
dev.p_device ist ein Pointer auf Dein struct, also müßte (dev.p_device)->name
Es wird ja in der Klassendefinition nur der Pointer deklariert, es wird keine Struktur erstellt.
Ich initialisiere die Struktur in der gleichen Funktion, in der ich die Struktur mit Daten fülle. Muss ich dann den Pointer nochmal extra initialisieren?
Ich hab Strukturen so im Kopf, das der Pointer automatisch initialisiert wird, aber sicher bin ich mir nicht.
Hi,
Ich initialisiere die Struktur in der gleichen Funktion, in der ich die Struktur mit Daten fülle. Muss ich dann den Pointer nochmal extra initialisieren?
Du mußt für die Struktur erstmal Speicher allozieren und die dabei erhaltene Speicheradresse Deinem Pointer zuweisen.
cu,
Andreas
Hi,
Du mußt für die Struktur erstmal Speicher allozieren und die dabei erhaltene Speicheradresse Deinem Pointer zuweisen.
Ja, langsam versteh ich, wo ich den Denkfehler drin hab. Ich werd mich heute hinsetzen und einiges ändern.
Danke an alle für die Tips :)
Moin,
das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung.
Fehlermeldung kommt keine, nur ist der Wert in der int main() nicht verfügbar.
class Device{
public:
Device(char* devicelist);
~Device();int device_number;
const char* id[];struct device_data{
const char* name;
const char* description;
const char* filename;
} *p_device;private:
ezxml_t DeviceList(char* device_list);
std::string devices_e;
char devices_c[];
};Ich vermute mal, dass du die Struktur oder die Instanz der Struktur nicht public gemacht hast.
Die Struktur ist also Public.
if(device[device_counter].name = ezxml_attr(attribute_list, "id"));
Was ist denn device? Das muss eine Variable sein. Ein Mitglied deiner
Device-Klasse ist es jedenfalls nicht.
Ich vermute mal:
Device::device_data device[];
oder
Device::device_data* device;
und dann irgendsowas wie
device = MyDevice.p_Device;
wobei MyDevice eine Instanz der Klasse Device ist.
(Wobei "device_counter" über eine for()-Schleife erhöht wird)
Jetzt kann ich innerhalb der Klasse auf device[0].name zugreifen.
Wenn ich allerdings aus der int main() auf diesen Wert zugreifen will:Device dev(devicefile);
cout << dev.device[0].name << endl;Kommt die Meldung, das "device" kein Member der Klasse Device ist. Wenn ich per *p_device zugreifen will, klappt es auch nicht.
s. o. Daraus folgt dann die Fehlermeldung.
Und, was heißt "klappt es auch nicht"? Fehlermeldung (dann bitte den Inhalt) oder Fehlverhalten (was erwartest du und was passiert) oder was? Kristallkugeln sind zur Zeit ausverkauft und z. B. dev.p_device->name sollte legal sein.
Insgesammt will ich ein Array in der Klasse erzeugen, auf dessen Werte ich in der main() zugreifen kann. Mit Werten ausserhalb der Struktur klappt es ja auch ;)
Bisher hatte ich noch nie eine STruktur innerhalb einer Klasse, deshalb ist das ein problem für mich, und ich komm einfach nicht weiter :(