Problem mit Deklaration bei C++



  • Super, vielen Dank 🙂



  • Was für ein grässliches Denglisch.



  • Ich hab noch ein weites Problem und zwar baue ich gerade die Methode "print" von Kunde:

    void Kunde::print() {
        cout << "Kunde: " << name << endl << "Auftraege: ";
        for(int i = 0; i < vMyAuftr.size(); i++)
            cout << (*(vMyAuftr.at(i))).getID() << " ";
    }
    

    Da bekomm ich folgenden Fehler:

    kunde.h:46:36: error: invalid use of incomplete type ‘struct Auftrag’
    kunde.h:7:7: error: forward declaration of ‘struct Auftrag’


  • Mod

    In der Implementierung reicht die Vorwärtsdeklaration nicht mehr. Da musst du dann wirklich die auftrag.h einbinden.



  • Klar, in kunde.h hast du (wg. Vermeidung zyklischer Einbindung der Header) nur eine Forward Declaration. Um "Auftrag" verwenden zu können, brauchst du aber die Definition der Klasse, die du erst mit dem include bekommst.
    Um nicht wieder in zyklisches einbinden zu laufen, legst du eine Datei "kunde.cpp" an, in die du die Definition von Kunde::print() vornimmst. Dort kannst du gefahrlos kunde.h und auftrag.h einbinden.

    @SeppJ: er implementiert gerade in kunde.h (laut Fehlermeldung)



  • Evtl. könnte man bei den Funktions(deklarationen)auch besser Referenzen statt Zeiger verwenden?



  • redrew99 schrieb:

    Evtl. könnte man bei den Funktions(deklarationen)auch besser Referenzen statt Zeiger verwenden?

    Evtl. könnte man bei den Funktions(deklarationen)auch besser die Zeiger lassen?



  • mal ganz ehrlich: referenzen in klassen verwenden? das hab ich nie gebraucht bis jetzt, ist auch recht unflexibel aus meiner sicht. klar es gibt sicherlich das ein oder andere anwendungsgebiet, aber da gibts bessere alternativen.

    und zum zeiger: da gibts wahrlich bessere alternativen in diesem fall, und sei es nur ein smart pointer aus der STL. aber am besten ist immer noch, gar kein zeiger



  • Er meinte sicherlich bei

    void setKunde(Kunde* k);
    

    mit dem Gebetsmühlenargument, da der Kunde nicht 0 sein darf, müsse man das so per Referenz anzeigen.

    void setKunde(Kunde& k);
    

    Anderenfalls müsse man im Code von setKunde gegen 0 prüfen.
    Das ist jedesmal falsch, wenn dieses Argument kommt.

    Und diesmal besonders

    bla.setKunde(*new Kunde(...));
    

    :xmas2: :xmas2:



  • oh mist, kann auch sein. hab mir den quellcode nicht aufmerksam angeguckt -.-'


Anmelden zum Antworten