Kontruktor überladen



  • Hallo,

    wenn ich einen Konstruktor folgendermaßen überlade:

    class CTest
    {
    public:
    CTest(CString s1, CString s2, int i1=NULL);
    CTest(int i1=NULL);

    void add();
    }

    Und ich dann den 2.Konstruktor aufrufen will mit

    CTest test1();
    test1.add();

    Dann kommt die Fehlermeldung dass der linke Teil von add eine Klasse/Struktur/Union sein muss.

    Wenn ich den Konstruktor so aufrufe:

    CTest test1;

    Ohne die Klammern funktioniert es.
    Weiß jemand warum?



  • Ja, das ist eine der typischen Fallen in die Anfänger in C++ gerne tappen:

    Die Zeile mit den Klammern definiert kein Objekt test1, sondern deklariert eine Funktion test1, die ein Objekt vom Typ CTest zurückgibt und keine Parameter übernimmt. Und eine Funktion hat keine Methoden.



  • Eine Mehrdeutigkeit in der Sprache - der Ausdruck "CTest test1();" kann entweder für die Definition eines default-kontruierten Objekts stehen oder für die Deklaration einer (parameterlosen) Funktion. Und diese Mehrdeutigkeit wird nach Standard zugunsten der Funktion aufgelöst (vor allem weil es für die Objekt-Definition noch Alternativmöglichkeiten gibt).


Anmelden zum Antworten