STL- liste/vector: Vorraussetzung für eine Klasse um verwendet zu werden?



  • hi,

    ich bekomme bei allen klassen die ich als variable, nicht als pointer, in STL- listen/ vectoren verwenden will, folgenden fehler:

    ..\xutility(1237): error C2679: binary '=' : no operator found which takes a right-hand operand of type 'const TheClass' (or there is no acceptable conversion)

    Den Operator habe ich aber in "TheClass" definiert.

    meinen code baue ich dann immer so:

    TheClass myClass;
    list<TheClass> myList;
    myList.push_back(myClass);
    

    ich will eigentlich pointer vermeiden, da meist jemand vergisst am ende aufzuräumen.. daher wollte ich von "list<ThClass*>" weg.

    thx
    marcel



  • Zeig doch mal deine implementierung des op= bitte.

    Wenn du Zeiger brauchst sind boost::shared_ptr geeignet für stl-container.



  • http://www.c-plusplus.net/forum/viewtopic.php?t=85532&start=10
    da wird eine interessante klasse in containern gehandlet.



  • std::list braucht eigentlich nur den CCTor, nix weiter ... zumindest funzt es bei mir so 😃

    Ciao



  • RHBaum schrieb:

    std::list braucht eigentlich nur den CCTor, nix weiter ... zumindest funzt es bei mir so 😃

    Ciao

    die klasse braucht noch einen ctor der keine argumente annimmt,einen op= und ein copy-ctor 😉



  • otze schrieb:

    RHBaum schrieb:

    std::list braucht eigentlich nur den CCTor, nix weiter ... zumindest funzt es bei mir so 😃

    Ciao

    die klasse braucht noch einen ctor der keine argumente annimmt,einen op= und ein copy-ctor 😉

    Ausserdem sollte man schauen, dass man, wenn man schon einen von ihnen nimmt, auch
    die anderen grossen 2 nimmt 🙂

    mfg
    v R



  • ohja, op== brauchst du auch noch, zwar nicht für die container selbst, aber manche algos hauen dich, wenn sie den nicht bekommen(find...)



  • @otze
    Also Standard Ctor brauch er definitiv nicht, dafuer leg ich meine Hand ins feuer, zumindest fuer meine Impl 😃

    Ich hab sogar oft faelle, wo ich den Standard Constructor definitiv nicht haben will, trotzdem sind die in allen Fallen fuer die std::list geeignet ....

    Zuweisungsop braucher ja ... sorry vergessen. Sonst koenntest ja ned per dereferenzierten iterator die werte ueberschreiben ....

    Ciao ...



  • dann musst du dich bei der liste aber sehr einschränken, bzw du kannst dir von der liste keine objekte erstellen lassen, das müsstest du dann immer tun.



  • RHBaum, imho hat jede Klasse 'nen Standard-Ctor, nur dann halt einen automatisch erstellten.



  • @lars falsch.

    wenn ich einer Klasse einen anderen ctor als den automatisch generierten gebe, dann verfällt der automatische.



  • Hab ich was gegenteiliges behauptet 😕



  • imho hat jede Klasse 'nen Standard-Ctor

    ->ja.



  • Ich werd jetzt zwar sicher eines besseren belehrt aber wieso hat Lars Unrecht :D?

    Ich habs bei einer Schulung auch so gelernt, dass ein Standardkonstruktor immer erzeugt wird bzw. eigentlich angegeben werden muss weils Standard ist.
    So hat der g++ gemeckert und das visual studio 6 nicht, als wir dann testweise eine Klasse mit eigenen Konstruktor aber ohne Standardkonstruktor erstellt hatten.

    // Was sollte denn sonst passieren wenn man eine Instanz / ein Objekt erzeugt und nicht den eigenen Konstruktor aufruft? Dann wird doch der Defaultconstructor aufgerufen 😕



  • beispiel:

    class readfile{
            ifstream a;
        public:
            readfile(string name):a(name.c_str()){}
            int getInt(){//ganz ganz dummes beispiel
                int b;
                a>>b;
                return b;
            }
    };
    

    hier darf laut standard kein default ctor mehr hinzukommen, der user will das garnicht, da eine benutzung der klasse mit default initialisierung gefährlich wär(keine tests...). Das ist auch der grund, weshalb kein moderner compiler den default ctor da mit dazugibt.

    und das visual studio 6 nicht

    das visual studio ist ja auch älter als der jetzige standard, wie soll es das unterstützen können?

    Was sollte denn sonst passieren wenn man eine Instanz / ein Objekt erzeugt und nicht den eigenen Konstruktor aufruft? Dann wird doch der Defaultconstructor aufgerufen

    und wenn der nicht existiert, gibts einen compile error



  • Alles klar, hast Recht (hab eben mit VS 7 den Test gemacht 🙂 )



  • der VC 6.0 generiert auch den Standard Ctor nur, wenn du gar keinen CTor selber implementierst .... Er meckert aber auch ned, wenn du nen Object ohne standard Ctor hasst. Iss Imho eigentlich Standard conformes verhalten . (ausnahmsweise mal)

    @Otze
    Inwiefern bin ich ohne Standard Ctor eingeschraenkt ?
    Die Liste erezugt mir keine Objecte mittels Standard Ctor. Ich selber kann auch keine Objecte damit erzeugen ... klar. Aber das will ich ja auch ned, sonst wuerd ich ja nen Standard Ctor haben. Will ich kopien von elementen aus der Liste haben, nehm ich den CCtor .... MyClass temp(*it); // wenn it nen List-iterator ist ....
    Richtig ist aber, das ich noch nen anderen Ctor brauch, um elemente erst mal erzeugen zu koennen .... sonst hab ich das henne / Ei problem ....
    Aber es muss nicht der Standard Ctor sein !

    Ciao ...



  • RHBaum schrieb:

    der VC 6.0 generiert auch den Standard Ctor nur, wenn du gar keinen CTor selber implementierst .... Er meckert aber auch ned, wenn du nen Object ohne standard Ctor hasst. Iss Imho eigentlich Standard conformes verhalten . (ausnahmsweise mal)

    standardkonformes verhalten ist, einen standard-ctor nur dann zu erstellen, wenn es keinen anderen ctor gibt, und zu meckern, wenn versucht wird ein objekt(mit einem user defined ctor der parameter verlangt) über den nichtexistenten standardctor aufzurufen.

    @Otze
    Inwiefern bin ich ohne Standard Ctor eingeschraenkt ?
    Die Liste erezugt mir keine Objecte mittels Standard Ctor. Ich selber kann auch keine Objecte damit erzeugen ... klar. Aber das will ich ja auch ned, sonst wuerd ich ja nen Standard Ctor haben. Will ich kopien von elementen aus der Liste haben, nehm ich den CCtor .... MyClass temp(*it); // wenn it nen List-iterator ist ....
    Richtig ist aber, das ich noch nen anderen Ctor brauch, um elemente erst mal erzeugen zu koennen .... sonst hab ich das henne / Ei problem ....
    Aber es muss nicht der Standard Ctor sein !

    Ciao ...

    *hust* *hust* sorry, ich musste eben gewaltsam einen satz runterschlucken-.-

    list(size_type n) Creates a list with n elements, each of which is a copy of T().

    wenn das keine einschränkung ist, dann weis ich nicht.
    setzen 6-.-


Log in to reply