Default Ctor vs. Ctor mit einem optionalen Argument



  • Ich habe in einem Code einen bestehenden default constructor
    bla::bla()
    zu einem mit einem optionalen Argument umgeschrieben:
    bla::bla(const char* blub=0)

    Es gibt existierenden Code der noch die Version ohne Argumente benutzt.
    Nun meckert der Linker, dass bla::bla(void) undefiniert ist.
    Ist das normal?
    Denn man kann den Konstruktor doch weiterhin ohne Argument aufrufen.
    Ich war also davon ausgegangen dass ich keinen bestehenden Code breche.
    Oder gibt es da spezielle Regeln bei Konstruktoren?



  • Sollte gehen. Ein Standardkonstruktor ist jeder Konstruktor, der ohne Argumente benutzt werden kann.



  • Deklaration angepasst?


  • Mod

    scrontch schrieb:

    Es gibt existierenden Code der noch die Version ohne Argumente benutzt.
    Nun meckert der Linker, dass bla::bla(void) undefiniert ist.
    Ist das normal?

    Sofern der existierende Code nicht neu compiliert wurde, ja.



  • Die Deklaration wurde natürlich angepasst, sonst hätte es ja nicht mehr kompiliert.
    Ich habe alles neu kompiliert, Problem noch da.
    Ich habe auch einen Test gemacht und noch *zusätzlich* wieder einen ctor bla::bla() geschrieben und dann ist er glücklich. (Die Lösung gefällt mir aber nicht, da ich nun Code dupliziert habe)
    Btw, es handelt sich um MS VC8 (2005). Ist da vielleicht eine entsprechende Macke bekannt?
    Ich werd morgen weiter schauen.



  • scrontch schrieb:

    Btw, es handelt sich um MS VC8 (2005). Ist da vielleicht eine entsprechende Macke bekannt?

    Ich arbeite selbst seit Jahren mit MSVC 2005 ...
    Das einzige was ich mir vorstellen könnte, wäre dass wieder mal die Precompiled-Headers rumspinnen.
    Mach mal Rebuild-All, also so richtig "from scratch". Dann muss es gehen.
    Wenn nicht hast du vergessen was neu zu bauen - oder liegen noch wo alte .lib Files rum die dazugelinkt werden (falsche Linkerpfade?).



  • Hmm, ich finds einfach nicht. Rebuild all gemacht.
    Da wo der parameterlose default-Ctor gebraucht wird ist offensichtlich bei der Initialisierung der Basisklasse bei einer abgeleiteten Klasse.

    Hier der Linker-Error:
    Error 6 error LNK2019: unresolved external symbol "public: __thiscall CGSIPStackSimple::CGSIPStackSimple(void)" (??0CGSIPStackSimple@@QAE@XZ) referenced in function "public: __thiscall CGSIPStack::CGSIPStack(char const ,int,int (__cdecl)(char const *,long,char const *,int,char const *,int))" (??0CGSIPStack@@QAE@PBDHP6AH0J0H0H@Z@Z) GSIPStack.obj

    Im Beispiel wird also bla::bla(void) von foo::foo(...) gebraucht, wobei foo von bla abgeleitet ist.
    Und mein bla::bla(const char* blub=0) wird hier ignoriert. 😞


Log in to reply