Forum: PC-Programmierung obj x = obj(); ?


von max (Gast)


Lesenswert?

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?

von S. R. (svenska)


Lesenswert?

Das gleiche wir mK1, du hast den Standardkonstruktur nur explizit 
angegeben.

von max (Gast)


Lesenswert?

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'".

von S. R. (svenska)


Lesenswert?

Kann das sein, dass der Compiler das als Funktionsdeklaration mit dem 
Rückgabewert meineKlasse ansieht? Wäre auch möglich.

von max (Gast)


Lesenswert?

> 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.

von Oliver S. (oliverso)


Lesenswert?

Dafür (und dagegen) wurde uniform initialization eingeführt.
1
meineKlasse mK3{};

ist unmissverständlich, und tut, was du erwartest.

Oliver

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von Wilhelm M. (wimalopaan)


Lesenswert?

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{};

von Rolf M. (rmagnus)


Lesenswert?

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
Noch kein Account? Hier anmelden.