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 forauto_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.


Anmelden zum Antworten