GCC & auto_ptr



  • kann es sein, dass die Methode, die du aufrufst nicht const ist?

    ich bin mir gar nicht sicher, aber eigentlich sollte es nicht möglich sein, dass du ein const auto_ptr kopierst, da kopieren bei auto_ptr zerstörend ist. Lass vielleicht mal das const weg.



  • @Bashar: Ich poste mal die xxx.h und xxx.cpp, so dass du das ausprobieren kannst...

    // xxx.h
    #ifndef _XXX_H
    #define _XXX_H
    
    class XXX
    {
    public:
       XXX();
       XXX(int value);
       XXX(const XXX& source);
       const XXX& operator=(const XXX& source);
       int getValue() const {return m_Value;}
       void setValue(int value) {m_Value = value;}
    private:
       int m_Value;
    };
    
    #endif
    
    // xxx.cpp
    #include "xxx.h"
    #include <iostream>
    using namespace std;
    
    XXX::XXX()
       : m_Value(0)
    {
       cout << "Defaultkonstruktor" << endl;
    }
    
    XXX::XXX(int value)
       : m_Value(value)
    {
       cout << "int-Konstruktor" << endl;
    }
    
    XXX::XXX(const XXX& source)
       : m_Value(source.m_Value)
    {
       cout << "Copykonstruktor" << endl;
    }
    
    const XXX& XXX::operator=(const XXX& source)
    {
       m_Value = source.m_Value;
       cout << "Operator =" << endl;
       return *this;
    }
    

    @Steven: Ich werds mal ausprobieren, danke auf jeden Fall



  • ach, der Fehler ist klar (hättest du die Zeile angegeben, wo das passier hätte ich dir das auch vorher sagen können 🙄)

    std::auto_ptr ist ein Smart Pointer mit zerstörender kopierung. Heisst, dass es immer nur ein Objekt geben darf, was auf den Pointer zeigt. Wenn du einen auto_ptr in einen anderen kopierst, wird der erste zerstört. Deswegen erwartet der copy-operator und der copy-ctor ein nicht const Objekt. Du lieferst aber const auto_ptr<XXX> zurück. Lass mal das const weg und deine Probleme sollten der Vergangenheit angehören.

    Falls du trotzdem noch einen anderen Smart Pointer suchst, schau dir mal die Loki Library an oder das Buch "Modern C++ Design" (bzw. "Modernes C++ Design"). Das Kapitel über Smart Pointer solltest du glaub ich sogar Online als Probe Kapitel finden, auf der "Modern C++ Design" Seite



  • Mmmh...ne, gibt nur ne andere Fehlermeldung...

    Fakt ist:
    Unter Visual C++ wird das anstandslos kompiliert.
    Der Code ist 1:1 aus dem Buch übernommen.

    Naja, werde ich nochmal weitertüfteln müssen.....



  • Naja, ist aus Marcus' Buch

    Schau mal in den Errata-Text zum Buch.
    Dort habe ich Marcus zu dem Thema folgendes schreiben lassen:

    Dort wird aus den Funktionen getX1 und getString ein const auto_ptr zurück
    gegeben. Der Rückgabewert von getX1 wird später einem auto_ptr zugewiesen.
    Das ist in Standard-C++ nicht erlaubt, leider erlaubt der Microsoft Visual C++ 6
    diese Konstruktion. Der Visual C++ 7 meckert übrigens an dieser Stelle, genau
    wie der Borland C++ Builder und die ganzen GNU-Compiler.
    Ein const auto_ptr ist ein auto_ptr der niemals einen ownership Transfer
    durchführen kann. Er ist also immer das Ende einer Kette. Korrekterweise
    müssten beide Funktionen jeweils einen auto_ptr (ohne const) liefern. Leider
    gibt es bisher nur wenig Compiler die diesen Fehler bemerken.

    Wenn du genau wissen willst, warum sich ein const auto_ptr so verhält, such im Internet nach "colvin/gibbons trick" oder frag hier noch mal. Sei dir aber darüber im Klaren, dass die Technik dahinter nicht ohne ist (ohne gute Kenntnisse zum Thema lvale/rvalue-Bindung + Überladungsauflösung wird's schwer zu verstehen).

    Letztlich muss man aber auch nicht den Trick sondern nur dessen Auswirkung verstehen.

    PS:
    Ausführliches zum Thema auto_ptr findest du z.B. auch in meinen FAQs:
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=auto_ptr#Answ



  • Ach Hume, was wäre ich ohne dich... :D. Dachte schon ich zerbrech an dem Problem....



  • CarstenJ schrieb:

    Ach Hume, was wäre ich ohne dich... :D. Dachte schon ich zerbrech an dem Problem....

    was ist jetzt der Unterschied von dem was ich gesagt hab und Hume? Ist doch das gleiche. Das const war das Problem.



  • Ja aber Hume schafft es das selbe durch wesentlich mehr Fachbegriffen intelligenter wirken zu lassen. (@Hume: Das ist nicht böse gemeint.)



  • Ich danke natürlich auch dir, Kingruedi und allen anderen, die mir geholfen haben. Vor allem hat mich aber verunsichert, dass der Code mit dem VC++ kompiliert wurde, und das konnte ich mir beim besten Willen nicht erklären.

    Laufen tuts bei mir übrigens immer noch nicht, weder mit const noch ohne, aber das liegt wohl wirklich an meiner Implementierung des auto_ptr. Werde jetzt mal die von Steven testen und ich tiefer in die Materie einarbeiten.



  • was sagt der denn jetzt? 🙄



  • Habs hinbekommen....ohne const läuft es jetzt, hatte noch nen Alias auf den GCC 2.96, und mit dem liefs nicht. 🙄
    Ich glaube ich spiele erstmal was anderes als C++. 😃


Log in to reply