Hallo Liste!
Damit ich nicht der einzige bin, der lustige C++-Rätsel anzubieten hat:
Wie kann ich möglichst schmerzfrei den Typ einer abgeleiteten Klasse restaurieren, nachdem ich das Objekt in einem vector<virtualbaseclass> hatte? Ich weiß dabei nicht, welchen Typs das Objekt ist, nur die Basisklasse (geht ja aus dem vector hervor. Um das ganze mal zu illutrieren ein Beipiel:
virtuelle Basisklasse A, abgeleitete Klassen A1 und A2, vector<A>. A1 a1; A2 a2; vector<A> aa; aa.push_back(a1); aa.push_back(a2); aa[0].virtual_method() soll nun A1::virtual_method() referzieren und nicht A::virtual_method()...
Noch spezifischer:
---snip---------------- #include <iostream> #include <vector>
// basis klasse class A { public: virtual int x(void) {return 0;} };
// abgeleitet 1 class A1 : public A { public: virtual int x(void) {return 1;} };
// abgeleitet 2 class A2 : public A { public: virtual int x(void) {return 2;} };
int main(int argc, char* argv[]) { A a; A1 a1; A2 a2;
A &l = a; A &n = a1; A &m = a2;
std::vector<A> aa; aa.push_back(a); aa.push_back(a1); aa.push_back(a2);
cout << "direct: a=" << a.x() << " a1=" << a1.x() << " a2=" << a2.x() << "\n";
cout << "reference: a=" << l.x() << " a1=" << n.x() << " a2=" << m.x() << "\n";
cout << "from vec: a=" << aa[0].x() << " a1=" << aa[1].x() << " a2=" << aa[2].x() << "\n";
return 0; } ---snip----------------
ergibt:
direct: a=0 a1=1 a2=2 reference: a=0 a1=1 a2=2 from vec: a=0 a1=0 a2=0
Ich hätte in der letzten Zeile aber lieber from vec: a=0 a1=1 a2=2
Mach ich da irgendwas falsch? Kann man das irgendwie erreichen?
Gruß, Eric
On Thu, 12 Sep 2002 18:27:10 +0200, Eric Schaefer wrote: n'Abend!
Das scheint nur zu klappen, wenn du mit std::vector<*A> arbeitest.
Schau mal bei google den Thread ab Message-ID: 38791AD2.A7F7E437@yahoo.com an. Da hatte einer das gleiche Problem.
Reinhard
On Thu, Sep 12, 2002 at 08:39:02PM +0200, Reinhard Foerster wrote:
Das scheint nur zu klappen, wenn du mit std::vector<*A> arbeitest.
*tischkanteanknabber*
Ich Depp...
Der Witz ist, daß ich nur ein wenig rumgetestet habe, wie ich an ein Problem am besten herangehen könnte. Die Instanzen von A? sollten sowieso dynamisch erzeugt werden...
Danke, Eric p.s. das sigmoster hat mal wieder mitgedacht...
hallo wie wäre es, im vector zeiger auf die objekte zu speichern. zugriff auf virtuelle methoden funktioniert über basisklassenZEIGER... dein quellcode einfach angepaßt bringt schon das erwünschte ergebnis, wahrscheinlich sollten dann aber auch die objekte mit new erzeugt werden, kommt sicher auf den context darauf an... mit schönem gruß aus bautzen ralf wilke.
---snip---------------- #include <iostream> #include <vector>
// basis klasse class A { public: virtual int x(void) {return 0;} };
// abgeleitet 1 class A1 : public A { public: virtual int x(void) {return 1;} };
// // abgeleitet 2 class A2 : public A { public: virtual int x(void) {return 2;} };
int main(int argc, char* argv[]) { A a; A1 a1; A2 a2;
A &l = a; A &n = a1; A &m = a2;
std::vector<A*> aa; //*******AENDERUNG aa.push_back(&a); //*******AENDERUNG aa.push_back(&a1); //*******AENDERUNG aa.push_back(&a2); //*******AENDERUNG
std::cout << "direct: a=" << a.x() << " a1=" << a1.x() << " a2=" << a2.x() << "\n";
std::cout << "reference: a=" << l.x() << " a1=" << n.x() << " a2=" << m.x() << "\n";
std::cout << "from vec: a=" << aa[0]->x() //*******AENDERUNGEN << " a1=" << aa[1]->x() << " a2=" << aa[2]->x() << "\n";
return 0; } ---snap----------------
----- Original Message ----- From: "Eric Schaefer" eric@gixgax.de To: "LUG-DD Liste" lug-dd@schlittermann.de Sent: Thursday, September 12, 2002 6:27 PM Subject: [C++] Raetsel?
Hallo Liste!
Damit ich nicht der einzige bin, der lustige C++-Rätsel anzubieten hat:
Wie kann ich möglichst schmerzfrei den Typ einer abgeleiteten Klasse restaurieren, nachdem ich das Objekt in einem vector<virtualbaseclass> hatte? Ich weiß dabei nicht, welchen Typs das Objekt ist, nur die Basisklasse (geht ja aus dem vector hervor. Um das ganze mal zu illutrieren ein Beipiel:
virtuelle Basisklasse A, abgeleitete Klassen A1 und A2, vector<A>. A1 a1; A2 a2; vector<A> aa; aa.push_back(a1); aa.push_back(a2); aa[0].virtual_method() soll nun A1::virtual_method() referzieren und nicht A::virtual_method()...
Noch spezifischer:
---snip---------------- #include <iostream> #include <vector>
// basis klasse class A { public: virtual int x(void) {return 0;} };
// abgeleitet 1 class A1 : public A { public: virtual int x(void) {return 1;} };
// abgeleitet 2 class A2 : public A { public: virtual int x(void) {return 2;} };
int main(int argc, char* argv[]) { A a; A1 a1; A2 a2;
A &l = a; A &n = a1; A &m = a2;
std::vector<A> aa; aa.push_back(a); aa.push_back(a1); aa.push_back(a2);
cout << "direct: a=" << a.x() << " a1=" << a1.x() << " a2=" << a2.x() << "\n";
cout << "reference: a=" << l.x()
<< " a1=" << n.x() << " a2=" << m.x() << "\n";
cout << "from vec: a=" << aa[0].x() << " a1=" << aa[1].x() << " a2=" << aa[2].x() << "\n";
return 0; } ---snip----------------
ergibt:
direct: a=0 a1=1 a2=2 reference: a=0 a1=1 a2=2 from vec: a=0 a1=0 a2=0
Ich hätte in der letzten Zeile aber lieber from vec: a=0 a1=1 a2=2
Mach ich da irgendwas falsch? Kann man das irgendwie erreichen?
Gruß, Eric -- The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense. -- Edsger Wybe Dijkstra
Lug-dd maillist - Lug-dd@schlittermann.de http://mailman.schlittermann.de/mailman/listinfo/lug-dd
lug-dd@mailman.schlittermann.de