Objekt als Klassenvariable?



  • Moin, moin,

    ich habe vor kurzem angefangen mit C++ zu programmieren (vorher in diversen anderen Sprachen) und stehe nun vor dem Problem, dass ich ein Objekt als Klassenvariable erstellen möchte.

    Also ich habe meine eigene Klassen stone und grid. Innerhalb von stone möchte ich ein grid Objekt erstellen welches für alle stone Objekte das selbe ist.

    habe das mit

    class stone{
    (...)
    private: static grid xy;
    );
    
    grid stone::xy = new grid();
    

    probiert, bekomme dann aber den Fehler "conversion from `grid*' to non-scalar type `grid' requested" damit kann ich nichts anfangen, auch Google war nicht sonderlich hilfreich.

    Habe bei der letzten Zeile dann mal das erste grid weggelassen und bekomme den Fehler:

    "expected constructor, destructor, or type conversion before '=' token"

    Ich hoffe, das Problem verständlich rübergebracht zu haben, ist sicherlich auch nichts großes, aber als c++ Anfänger ist mir die Syntax nicht so geläufig.


  • Mod

    1. Guck dir mal an, was new macht. Es macht nämlich was anderes als du wahrscheinlich denkst und es wäre wichtig, dass du das änderst.

    2. So macht man das:

    class stone{
    (...)
    private: static grid xy;
    );
    
    grid stone::xy();
    


  • SeppJ schrieb:

    2. So macht man das: [...]

    Ne, so:

    grid stone::xy; // oder
    grid stone::xy = grid();
    


  • b1100101 schrieb:

    ...vorher in diversen anderen Sprachen...

    Das merkt man, da du Probleme mit Heap- und Stackvariablen hast - und nicht etwa mit Objekten als Klassenvariable (oder halt nur durch ersteres).

    b1100101 schrieb:

    class stone{
    (...)
    private: static grid xy; // Stackobjekt
    );
    
    // grid stone::xy = new grid(); // new in C++ nur bei Heapobjekten (Zeiger)
    grid stone::xy = grid(); // versuch dies mal...
    

  • Mod

    LordJaxom schrieb:

    SeppJ schrieb:

    2. So macht man das: [...]

    Ne, so:

    grid stone::xy; // oder
    grid stone::xy = grid();
    

    Ups, zu viele Klammern bei mir.



  • Danke schonmal für die hilfreichen antworten,
    new unter c++ werde ich mir nochmal googlen. 🙂

    Habe da nun also
    static grid xy;
    und
    grid stone::xy = grid();

    stehen.

    Kompilliert ansich auch.
    Nur wenn ich jetzt in einer stone Methode
    printf("Gridtest: %i \n", xy.getGrid(3,4));

    aufrufe meckert er "first defined here" und "multiple definition of `stone::xy' an, beides aber außerhalb meines Codes, in der glut.h
    Das merkwürdigste am ganzen ist aber, wenn ich die printf Zeile wieder rausnehme meckert er das immernoch an. Ändere ich nun xy in xyz geht es wieder solange bis ich die printf Zeile wieder reinnehme. 😕



  • Die Definition

    grid stone::xy;
    

    mußt du in die Source-Datei (*.cpp) schreiben, nicht in die Header-Datei!



  • das scheint zu funktionieren, auch wenn ich es noch nicht so ganz verstehe. Ich teste mal rum. Danke!


  • Mod

    edit: Hier stand Kram der zwar technisch richtig, aber doch eher verwirrend war.


Log in to reply