Ynnus
16.05.2005, 00:52
Hallöchen,
ich hätt mal wieder eine Frage, diesmal zur Union in C++. (Dürfte aber in anderen Sprachen ähnlich sein).
Und zwar habe ich eine Klasse listenelement welche als Attribute Objekte von 3 anderen Klassen haben soll. Etwa so:
class listenelement
{
public:
object teil1;
object2 teil2;
object3 teil3;
};(Attribute sind zum Test beabsichtigt public).
Ich habe nun mehrere Objekte der Klasse listenelement welche jeweils aber immer nur die Daten eines der 3 Klassen object, object2 und object3 benötigt. Also es kommt nicht vor, dass dieses Objekt vom Typ listenelement den Speicher für teil1 und teil2 oder teil1 und teil3 oder so benötigt. Sondern immer nur entweder teil1, teil2 oder teil3 werden beansprucht.
Da dachte ich mir, um Speicher zu sparen, packe ich das Ganze in eine Union. Das sähe dann ja so aus:
class listenelement
{
public: union{
object teil1;
object2 teil2;
object3 teil3;
};
};
Jedes der Objekte benötigt unterschiedlich Speicher, die Klasse object etwa beinhaltet Attribute mit der Größe von 60 byte, object2 beinhatet 79 byte und object3 130 byte große Attribute. (Alle Werte sind Beispielwerte die aber meinem Programm recht nah' kommen).
Wie wird jetzt genau der Speicher reserviert? Der reservierte Speicher muss ja irgendwie groß genug sein, dass aus das größte Objekt der Union reinpasst, also 130 byte. Oder kann man Klassen bzw. Objekte garnicht so in Unions packen? Funktioniert das wirklich so zuverlässig, dass es da keine Probleme mit Objekten in Unions gibt, auch wenn die Objekte teils recht komplexe weitere Vererbungen (manchmal mehrfach-vererbungen) von anderen Klassen sind?
Oder kann man diese Art wahlweisen Zugriff möglicherweise noch ganz anders in der OOP lösen, durch eine Art dynamisch ein Attribut erstellen oder so?
Wär schön wenn mir da jemand was zu diesen Union-Einheiten sagen könnte.
EDIT: Wo wir gerade dabei sind, gleich die nächste Frage dazu.
Mal angenommen, ich möchte dieses objekt jetzt ansprechen, würd ich das ja so tun:
listenelement name;
name.teil1."attribut"
Für den Fall, dass dieses Objekt Listenelement die Daten des Objekts "teil2" beinhalten soll, müsste ich es so ansprechen:
listenelement name;
name.teil2."attribut"
Nun ist die Frage, wie könnte man es einrichten, dass man die Attribute der Objekte teil1 oder teil2 mit ein und dem selben Aufruf ansprechen kann? Also, dass beide Attribute der Objekte so anzusprechen sind:
listenelement name;
name.union."attribut" = *sonstwas*
Union kann da jedes beliebige Wort sein, was auch immer.
Ich dachte da an pointer, dass man die Adresse des Objekts teil1 oder teil2 in einem Pointer speichert und dann mittels dieses Pointers auf die Attribute von teil1 oder teil2 zugreifen kann:
class listenelement
{
public: union{
object teil1;
object2 teil2;
object3 teil3;
};
object* pointer;
};
//...
pointer = &teil1; //<-- Irgendwo folgt dann zuweisung der Adresse, je nach genutztes Element ist es auf teil1, teil2 oder teil3...
//...
listenelement name;
name.pointer->"attribut" = *sonstwas*
Die Problematik hier ist jetzt, dass ich das ich da Probleme mit den Typen der Pointer bekomme. Das hier: "pointer = &teil1;" kann ich nur so schreiben, wenn ich auf teil2 zeigen will, geht dies nicht, da teil2 vom Typ object2 ist. Und den Pointer hab ich innerhalb der Klasse listenelement ja als pointer des typs object erstellt.
Wie ließe sich das machen, dass ich einen Pointer erstellen kann, der auf jedes der drei Elemente zeigen kann?
Kann man den Pointer irgendwie dynamisch je nach Typ des Objects casten lassen?
Dass, wenn er auf teil1 zeigt, er den Typ object annimmt, bei teil2 den Typ object2 und bei teil3 den Typ object3?
Hach, das klingt jetzt sicher alles recht verwirrent. Hat's vielleicht trotzdem jemand verstanden und kann mir da helfen? Ich will doch nur dynamisch auf einen der 3 objecte zugreifen können mit dem selben Aufruf (mittels pointer oder sonstwie) und diese 3 Elemente sollen sich den Speicher teilen, da immer nur eines in Benutzung ist. :\
mfg.
Ynnus aka Sunny
ich hätt mal wieder eine Frage, diesmal zur Union in C++. (Dürfte aber in anderen Sprachen ähnlich sein).
Und zwar habe ich eine Klasse listenelement welche als Attribute Objekte von 3 anderen Klassen haben soll. Etwa so:
class listenelement
{
public:
object teil1;
object2 teil2;
object3 teil3;
};(Attribute sind zum Test beabsichtigt public).
Ich habe nun mehrere Objekte der Klasse listenelement welche jeweils aber immer nur die Daten eines der 3 Klassen object, object2 und object3 benötigt. Also es kommt nicht vor, dass dieses Objekt vom Typ listenelement den Speicher für teil1 und teil2 oder teil1 und teil3 oder so benötigt. Sondern immer nur entweder teil1, teil2 oder teil3 werden beansprucht.
Da dachte ich mir, um Speicher zu sparen, packe ich das Ganze in eine Union. Das sähe dann ja so aus:
class listenelement
{
public: union{
object teil1;
object2 teil2;
object3 teil3;
};
};
Jedes der Objekte benötigt unterschiedlich Speicher, die Klasse object etwa beinhaltet Attribute mit der Größe von 60 byte, object2 beinhatet 79 byte und object3 130 byte große Attribute. (Alle Werte sind Beispielwerte die aber meinem Programm recht nah' kommen).
Wie wird jetzt genau der Speicher reserviert? Der reservierte Speicher muss ja irgendwie groß genug sein, dass aus das größte Objekt der Union reinpasst, also 130 byte. Oder kann man Klassen bzw. Objekte garnicht so in Unions packen? Funktioniert das wirklich so zuverlässig, dass es da keine Probleme mit Objekten in Unions gibt, auch wenn die Objekte teils recht komplexe weitere Vererbungen (manchmal mehrfach-vererbungen) von anderen Klassen sind?
Oder kann man diese Art wahlweisen Zugriff möglicherweise noch ganz anders in der OOP lösen, durch eine Art dynamisch ein Attribut erstellen oder so?
Wär schön wenn mir da jemand was zu diesen Union-Einheiten sagen könnte.
EDIT: Wo wir gerade dabei sind, gleich die nächste Frage dazu.
Mal angenommen, ich möchte dieses objekt jetzt ansprechen, würd ich das ja so tun:
listenelement name;
name.teil1."attribut"
Für den Fall, dass dieses Objekt Listenelement die Daten des Objekts "teil2" beinhalten soll, müsste ich es so ansprechen:
listenelement name;
name.teil2."attribut"
Nun ist die Frage, wie könnte man es einrichten, dass man die Attribute der Objekte teil1 oder teil2 mit ein und dem selben Aufruf ansprechen kann? Also, dass beide Attribute der Objekte so anzusprechen sind:
listenelement name;
name.union."attribut" = *sonstwas*
Union kann da jedes beliebige Wort sein, was auch immer.
Ich dachte da an pointer, dass man die Adresse des Objekts teil1 oder teil2 in einem Pointer speichert und dann mittels dieses Pointers auf die Attribute von teil1 oder teil2 zugreifen kann:
class listenelement
{
public: union{
object teil1;
object2 teil2;
object3 teil3;
};
object* pointer;
};
//...
pointer = &teil1; //<-- Irgendwo folgt dann zuweisung der Adresse, je nach genutztes Element ist es auf teil1, teil2 oder teil3...
//...
listenelement name;
name.pointer->"attribut" = *sonstwas*
Die Problematik hier ist jetzt, dass ich das ich da Probleme mit den Typen der Pointer bekomme. Das hier: "pointer = &teil1;" kann ich nur so schreiben, wenn ich auf teil2 zeigen will, geht dies nicht, da teil2 vom Typ object2 ist. Und den Pointer hab ich innerhalb der Klasse listenelement ja als pointer des typs object erstellt.
Wie ließe sich das machen, dass ich einen Pointer erstellen kann, der auf jedes der drei Elemente zeigen kann?
Kann man den Pointer irgendwie dynamisch je nach Typ des Objects casten lassen?
Dass, wenn er auf teil1 zeigt, er den Typ object annimmt, bei teil2 den Typ object2 und bei teil3 den Typ object3?
Hach, das klingt jetzt sicher alles recht verwirrent. Hat's vielleicht trotzdem jemand verstanden und kann mir da helfen? Ich will doch nur dynamisch auf einen der 3 objecte zugreifen können mit dem selben Aufruf (mittels pointer oder sonstwie) und diese 3 Elemente sollen sich den Speicher teilen, da immer nur eines in Benutzung ist. :\
mfg.
Ynnus aka Sunny