Dummies::smart_pointer
-
Es geht hier um Beispiele aus Marcus' Buch. Ich habe gesucht, aber speziell darauf keine Antwort gefunden. Und zwar geht es um smart_pointer (S. 139, smart2.cpp). Ich benutze den GCC 3.2.2 unter Linux.
Es geht um dieses Beispiel:
#include <memory> #include <iostream> using namespace std; class A { public: A() { cout << "A::A" << endl; } ~A() { cout << "A::~A" << endl; } void doSomething() { cout << "Hallo!" << endl; } }; int main() { auto_ptr<A> pObjectA1; auto_ptr<A> pObjectA2; pObjectA1 = auto_ptr<A>(new A); pObjectA1->doSomething(); pObjectA2 = pObjectA1; pObjectA2->doSomething(); return 0; }
Das funktioniert so nicht, bekomme folgende Fehlermeldung:
smart.cpp: In function
int main ()': smart.cpp:30: no match for
auto_ptr<A> & = auto_ptr<A>'
/usr/include/g++-3/memory:40: candidates are: auto_ptr<_Tp>
&auto_ptr<_Tp>::operator= (auto_ptr<_Tp> &) [with _Tp = A]
/usr/include/g++-3/memory:48: auto_ptr<_Tp>
&auto_ptr<_Tp>::operator= (auto_ptr<_Tp1> &) [with _Tp1 = A, _Tp = A]Folgender Code wird anstandslos kompiliert. Ich verstehe jetzt aber nicht, ob der Code das gleiche tut?!
#include <memory> #include <iostream> using namespace std; class A { public: A() { cout << "A::A" << endl; } ~A() { cout << "A::~A" << endl; } void doSomething() { cout << "Hallo!" << endl; } }; int main() { auto_ptr<A> pObjectA1(new A); auto_ptr<A> pObjectA2(new A); pObjectA1->doSomething(); pObjectA2 = pObjectA1; pObjectA2->doSomething(); return 0; }
Kann mir einer erklären woran das liegt? Kompilier ich das falsch? (g++ smart.cpp -o smart -Wall). Unter VC++ 6 funktioniert es, wie im Buch beschrieben.
-
Hallo,
der Originalcode ist korrekt, wenn auch etwas zweifelhaft. Der gcc macht hier also einen Fehler. Scheinbar kommt er mit der rvalue-Zuweisung von auto_ptr nicht zurecht.
Da ich aber die auto_ptr-Implementation des gcc nicht kenne, kann ich dir nicht sagen, was genau falsch läuft.Btw: Dein Code ist nicht äquivalent, da du zwei As erzeugst.
So ist's besser:
int main() { auto_ptr<A> pObjectA1(new A); auto_ptr<A> pObjectA2; pObjectA1->doSomething(); pObjectA2 = pObjectA1; pObjectA2->doSomething(); return 0; }
Oder ohne Zuweisung:
int main() { auto_ptr<A> pObjectA1(new A); pObjectA1->doSomething(); auto_ptr<A> pObjectA2(pObjectA1); pObjectA2->doSomething(); return 0; }
-
Btw: Dein Code ist nicht äquivalent, da du zwei As erzeugst.
Das erklärt dann auch die unterschiedlichen Ausgaben.
Jetzt läufts einwandfrei, vielen Dank.