error: invalid use of undefined type `struct...



  • Danke!... naja, darauf hätte ich eigentlich selber kommen müssen! 🙄

    Aber nun habe ich eine andere Frage: Ich habe mir eine Klasse erstellt und die enthält unter anderem eine Liste, dabei sind die Elemente der Liste vom Typ meiner Klasse (ich hoffe man versteht was ich meine...). Gibt es für sowas einen bestimmten Begriff? (wie z.B. Rekursion)



  • Allroad schrieb:

    Aber nun habe ich eine andere Frage: Ich habe mir eine Klasse erstellt und die enthält unter anderem eine Liste, dabei sind die Elemente der Liste vom Typ meiner Klasse (ich hoffe man versteht was ich meine...). Gibt es für sowas einen bestimmten Begriff? (wie z.B. Rekursion)

    Komposition?

    Wenn ein Objekt ein anderes enthält ist dies eine Komposition (unabhängig davon ob es eine 1:1 oder 1:n Verbindung ist).

    http://de.wikipedia.org/wiki/Komposition_(UML)#Komposition_und_Aggregation

    cu André



  • ist nicht ganz was ich suche... Ich dachte es ist sowas wie Rekursion, nur gehts dabei nicht um eine Funktion sonderen eine Klasse die als Element wieder die gleiche Klasse hat. Konkret sieht das bei mit so aus:

    class ClassCB : public QWidget  
    
     {
    
     public:
           ...  
    
     private:
         ...
         QList<ClassCB> underOrder; // das hier meine ich...
         ...
     };
    

    p.s. das ganze läuft unter Qt deswegen die komischen Q...



  • Allroad schrieb:

    ist nicht ganz was ich suche... Ich dachte es ist sowas wie Rekursion, nur gehts dabei nicht um eine Funktion sonderen eine Klasse die als Element wieder die gleiche Klasse hat. Konkret sieht das bei mit so aus:

    Das ist eine Komposition, und wenn du es noch genauer willst, ist dies Eine Variante des "Kompositum-Entwurfsmusters".

    http://de.wikipedia.org/wiki/Entwurfsmuster
    http://de.wikipedia.org/wiki/Kompositum_(Entwurfsmuster)

    cu André



  • Super, danke... ist genau was ich suche!



  • mal wieder Probleme mit meiner Klasse....

    Nun möchte ich in einer anderen Klasse, ein Objekt vom Typ ClassCB erstellen. Dabei kommt folgende Fehlermeldung:

    error: invalid application of ´sizeof´ to incomplete type ´ClassCB´
    

    Heisst das, dass ich alle Elemente meiner Klasse initialisieren muss (in der Klassendefinition)?



  • inclompete Type heisst, dass der Compiler noch nicht die volle Klassendefinition gesehen hat (evtl. einen header nicht eingebunden?) erst wenn er weiss, welche Member die Klasse hat, kann er auch sagen, wieviel Platz sie im Speicher belegen wird (sizeof() tut genau das).



  • Danke, das wars (schon wieder Header nicht eingebunden, bzw. an der falschen Stelle...)!

    Damit ist aber nicht Schluss, nun habe ich folgendes Problem:

    src/classCB.h: In copy constructor ‘ClassCB::ClassCB(const ClassCB&)’:
    src/classCB.h:17:   instantiated from ‘void QList<T>::insert(int, const T&) [with T = ClassCB]’
    src/worksheet.cpp:117:   instantiated from here
    /usr/local/Trolltech/Qt-4.3.0rc1/include/QtGui/qwidget.h:701: error: ‘QWidget::QWidget(const QWidget&)’ is private
    

    wie gesagt, das Ganze wird für ein Qt-Programm gebraucht, aber ich denke das ist dennoch alles nur C++ Zeug...



  • Allroad schrieb:

    Danke, das wars (schon wieder Header nicht eingebunden, bzw. an der falschen Stelle...)!

    Damit ist aber nicht Schluss, nun habe ich folgendes Problem:

    src/classCB.h: In copy constructor ‘ClassCB::ClassCB(const ClassCB&)’:
    src/classCB.h:17:   instantiated from ‘void QList<T>::insert(int, const T&) [with T = ClassCB]’
    src/worksheet.cpp:117:   instantiated from here
    /usr/local/Trolltech/Qt-4.3.0rc1/include/QtGui/qwidget.h:701: error: ‘QWidget::QWidget(const QWidget&)’ is private
    

    wie gesagt, das Ganze wird für ein Qt-Programm gebraucht, aber ich denke das ist dennoch alles nur C++ Zeug...

    Jein... Ja, es lässt sich mit C++ Mitteln erklären, nein, es liegt schon am QT-Design ;p

    Scheinbar hat QWidget keinen Kopierkonstruktor, ist also nicht für Kopien vorgesehen. Da deine Klasse ClassCB von diesem erbt betrifft es auch diese. Nun ist es aber so, das QList wohl (wie eigentlich alle Kontainerklassen) den Kopierkonstruktor erwartet.

    Eine Möglichkeit das zu umgehen ist mit Zeigern statt Objekten zu arbeiten (oder wenn sich nicht den Kopf über Speicherfreigaben etc. machen will, alternativ mit Smartpointern wie z.B. boost::shared_ptr).

    cu André



  • Daher wird bei Qt ja eigentlich auch immer nur mit Pointern gearbeitet was Widgets etc angeht (siehe designer).



  • Uebersetzt: QList<ClassCB>::insert benutzt den Copy-Ctor von ClassCB. Der Widerum benutzt den Copy-Ctor von QWidget. Letzterer aber ist privta, kann daher nicht benuttz werden und die ganze Operation geht schief.

    Ich rate mal:

    - ClassCB hat ein Member oder Basisklasse vom Typ QWidget
    - Du hast selber keinen Copy-Ctor fuer ClassCB definiert, also macht dein Compiler das fuer dich. dafuer kopiert er einfach Stueck fuer Stueck die Innereien von ClassCB mittels der entsprechenden Copy-Ctoren - und das geht bei dem QWidget-Member schief.

    Also: Immer drauf achten dass du den Copy-Ctor op= und evtl. auch Dtor definierst, wenns die 0-8-15-Versionen vom Compiler nicht tun. Ich habgrade heute in den "C++ Coding Standards" von Sutter udn Alexandrescu gelesen, dass man am Besten einen entsprechenden Kommentar einbringt, wenn man die Dinger bewusst dem Compiler ueberlaesst, so kann man schnell sehen ob das einfach vergessen wurde 😉



  • Ok, das ist glaube ich doch recht hilfreich, aber mir fehlen noch ein Paar Grundkentnisse..., d.h. ich lese erstmal brav weiter über Kopierkonstruktoren, wenn ich dann nicht weiter komme melde ioch mich nochmal... (davon gehe ich mal aus..!) 😉



  • Geschafft...! Hab statt Objekte, Pointer benutzt und es funkt! Danke.

    QList<ClassCB*> myList
    

Anmelden zum Antworten