Kein geeigneter Standardkonstruktor verfuegbar



  • Sebastian08 schrieb:

    Aber sie ist wirklich so.

    error C2512: 'spar' : Kein geeigneter Standardkonstruktor verfuegbar

    Und dieser Fehler ist auch logisch... (Wobei ich noch immer nicht glaube das keine Zeilennummer/Datei usw kommt.

    spar a;
    

    Geht nur wenn eben dieser definiert ist. Der Compiler wird ja wohl kaum raten können was er an dieser Stelle übergeben soll (Du hast spar(int knr, char *n, float kstd, float p); als einzigen Konstruktor vorgesehen).



  • Hi,

    ich jetzt nur mal schnell drüber geflogen und konnte nichts genaues erkennen was den Compiler stört.

    Was du aber wissen solltest ist, dass wenn der Compiler auf das Wort class trifft legt er, falls du es nicht machst, automatisch einen Konstruktor, Destruktor, Standardkopierkonstruktor und Zuweisungsoperator an. Konstruktor und Destruktor hast du deklariert und vermutlcih auch definiert.

    Was ich allerdings komisch fande, war die Deklarartion von konto.h.

    Versuche es mal mit:

    #ifndef CKONTO_H_INCLUDED
    #define CKONTO_H_INCLUDED
    
    class Ckonto
    {
    public:
        Ckonto(int knr, char *n, float kstd);
        ~Ckonto();
    
        virtual void einzahlen(float betrag) = 0;
        virtual void auszahlen(float betrag) = 0;
        virtual void ueberweisen(Ckonto *k2, float betrag) = 0;
        virtual void erstellen(int knr)= 0;   
    
        int getkontonummer();
        float getkontostand();
        char getname();
    
        void schreibeKonto(char * fname);
        void leseKonto(char * fname);
    
    protected:
        int kontonummer;
        float kontostand;
        char *name;
    
    private:
        Ckonto( const Ckonto& );
        Ckonto& operator=( const Ckonto& ); 
    };
    #endif
    

    Konstruktor und Destruktor sind public. Standardkopierkonstruktor und Zuweisungsoperator private. Sollte es nun zu einer Nutzung des Standardkopierkonstuktor kommens wird der Compiler etwas genauer daraufhin weisen. Auch sind die Membervariablen protected. Wobei ich aber denke, dass war vielleicht mehr ein Fehler von dir.

    Gruß
    Lord Hong



  • Ach ja, jetzt sehe ich es auch. Mein Vorposter hat recht.

    spar a;
    spar b;
    
    spar(int knr, char *n, float kstd, float p);
    

    Da fehlen natürlich die Argumente.

    spar a( 4711, "Hello", 12.0, 1.0 );
    

    So wird es klappen. 😉



  • Mit dem Codestück von lord.hong funktioniert es zwar, aber wohl die letzten Fehler wenn ich es ausführen möchte:

    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall giro::giro(int,char *,float)" (??0giro@@QAE@HPADM@Z)
    Debug/bkvs.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    

    Sowas liebe ich ja...wenn ich auf den Fehler klicke, komme ich nicht zur Stelle wo der Fehler ist.



  • Sebastian08 schrieb:

    Sowas liebe ich ja...wenn ich auf den Fehler klicke, komme ich nicht zur Stelle wo der Fehler ist.

    Ist auch ein Linkerfehler, der findet keine entsprechende Stelle im Code. Der Fehler besagt, dass du eine Funktionsdefinition vergessen hast (der giro::giro() -Konstruktor).



  • Programm läuft soweit, nur wenn ich die Werte bei spar a im main programm mitgebe, ist ja mein standardkonstruktor überflüssig.

    die konto.h und konto.cpp habe ich ja bereits im ersten post stehen.



  • Sebastian08 schrieb:

    Programm läuft soweit, nur wenn ich die Werte bei spar a im main programm mitgebe, ist ja mein standardkonstruktor überflüssig.

    Logisch. Da man aber in der Regel Variablen erst deklariert wenn man diese verwendet, hätte man die Problematik vielleicht auch gänzlich vermeiden können...



  • Erstmal sorry, für meinen übereilten Beitrag gestern, ich habe Standardkopierkonstruktor gelesen.

    Sebastian08 schrieb:

    Programm läuft soweit, nur wenn ich die Werte bei spar a im main programm mitgebe, ist ja mein standardkonstruktor überflüssig.

    die konto.h und konto.cpp habe ich ja bereits im ersten post stehen.

    In deinem Fall legt der Kompilier keinen Standardkonstruktor an. Der Grund liegt in der Definition von spar. Die lautet:

    spar(int knr, char *n, float kstd, float p);
    

    Somit hast du dem Kompilier mitgeteilt wie du das Objekt erzeugen möchstest. Er wird nun auch keinen weitern Konstruktor erzeugen.

    Zum besseren Verständnis (mehr oder weniger Scott Meyer wieder gegeben.)

    class CEmpty
    {
    };
    

    Diese Klasse sieht im ersten Moment leer aus, in Wirklichkeit ist aber der C++ Kompiler ziemlich aktiv geworden.

    Um das Objet zu erzeugen, muss einen Konstruktor erzeugen. Wenn du es nicht machst, macht der Kompilier es für dich. Um das Objekt zu zerstören, legt einer einen Destruktor an, wenn du es nicht macht, macht er es automatisch und ohne zu fragen oder hinzuweisen.
    Wenn du ein Objekt vom Typ CEmpty einen Wert zuweisen möchtest und hast keinen Zuweisungsoperator definiert, macht der Kompiler es für dich und kopiert, falls ich mich noch richtig erinnere, bitweise (was bei Zeigern, const und Referenzen zu Problemen führen kann). So ähnlich verhält sich auch der Standardkopierkonstruktor.

    Des Wegen kann der Compiler auch diesen Code ausführen:

    {
     CEmpty e; // Konstruktor
     CEmpty f( e ); // Kopierkonstruktor
     f = e; // Zuweisungsoperator
    } // Destruktor für e und f
    

    Das solltest du bei C++ immer im Hinterkopf haben, das ist "dein tägliches Brot" (um Scott Meyers Wort wörtlich zu zitieren)!

    Gruß
    Lord Hong



  • das noch niemand die Standard-Fehler wie void main() und iostream.h bemaengelt hat 🤡



  • zwutz schrieb:

    das noch niemand die Standard-Fehler wie void main() und iostream.h bemaengelt hat 🤡

    Vermutlich liegt das nur daran, das so lange Quelltexte im Forum ungern wirklich gelesen werden 😉 (Ich habe z.B. auch nur nach der vom Compiler angemeckerten Stelle gesucht)...

    Aber um es nachzuholen:
    Weder void main() noch iostream.h sind C++... (@zwutz: Damit sollte das soll erfüllt sein ;p).

    cu André


Anmelden zum Antworten