Hallo, ich würde gerne wissen, was hier passiert: class meineKlasse { public: meineKlasse() { } meineKlasse(int x) { } }; meineKlasse mK1; //Objekt wird mit Standardkonstruktor erzeugt meineKlasse mK2(1); //Objekt wird mit dem anderen Konstruktor erzeugt meineKlasse mK3(); //?????? Es wird problemlos kompiliert, aber was für ein Ding ist nun mK3?
S. R. schrieb: > Das gleiche wir mK1, du hast den Standardkonstruktur nur explizit > angegeben. so dachte ich auch, aber ich kann auf mK3 "nicht zugreifen"! Gäbe es in der Klasse eine öffentliche Methode "void tueEtwas()", dann wird mK1.tueEtwas() kompiliert und macht auch das erwartete, aber mK3.tueEtwas() wirft die Fehlermeldung "reques for member 'tueEtwas' in mK3, wich is of non-class type 'meineKlasse'".
Kann das sein, dass der Compiler das als Funktionsdeklaration mit dem Rückgabewert meineKlasse ansieht? Wäre auch möglich.
> Kann das sein, dass der Compiler das als Funktionsdeklaration mit dem > Rückgabewert meineKlasse ansieht? Wäre auch möglich. Hört sich vernünftig an. Vielen Dank.
Dafür (und dagegen) wurde uniform initialization eingeführt.
1 | meineKlasse mK3{}; |
ist unmissverständlich, und tut, was du erwartest. Oliver
S. R. schrieb: > Kann das sein, dass der Compiler das als Funktionsdeklaration mit dem > Rückgabewert meineKlasse ansieht? Wäre auch möglich. So ist es. Du kannst in den meisten Fällen die Konstruktorargumente auch in geschweifte Klammern setzen, dann entsteht dieses Problem nicht:
1 | meineKlasse mK2{1}; //Objekt wird mit dem anderen Konstruktor erzeugt |
2 | meineKlasse mK3{}; |
Edit: Zu spät abgeschickt :)
:
Bearbeitet durch Moderator
Yalu X. schrieb: > S. R. schrieb: >> Kann das sein, dass der Compiler das als Funktionsdeklaration mit dem >> Rückgabewert meineKlasse ansieht? Wäre auch möglich. > > So ist es. Nennt sich "most vexing parse" und ist ein Uralt-Fallstrick. Das ist der Grund, warum ich immer zur uniform-initialization-syntax rate, auch wenn manche Leute hier das unschön finden. Hätte das o.g. Problem aber erfolgreich verhindert:
1 | meineKlasse mk3{}; |
2 | int x{}; |
S. R. schrieb: > Kann das sein, dass der Compiler das als Funktionsdeklaration mit dem > Rückgabewert meineKlasse ansieht? Wäre auch möglich. Das wäre nicht nur möglich, sondern ist definitiv so. Einfache Regel: Wenn es aussieht wie eine Funktionsdeklaration, dann ist es auch eine.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.