2011-07-21 12 views
15

W poniższym kodzie, dlaczego kompilator nie narzeka na mClass2?C++ - Co się dzieje, jeśli konstruktor jest prywatny?

class CMyClass{ 
private: 
    CMyClass(){} 
}; 

void TestMethod(){ 
    CMyClass mClass1; //Fails. 
    CMyClass mClass2(); //Works. 
} 
+0

związane http://stackoverflow.com/questions/4296090/some-problems-while-learning-stl/4296118#4296118 –

+1

Znany również jako: najbardziej irytujących Parse (patrz http: // pl. wikipedia.org/wiki/Most_vexing_parse) –

Odpowiedz

16

Bo właśnie ogłosił funkcję mClass2 o zerowej argumentów, które zwraca CMyClass. Jest to ważna opcja, ponieważ może istnieć, na przykład, instancja static CMyClass, do której ta funkcja ma dostęp. Zauważ, że CMyClass nadal ma publiczny konstruktor kopii.

(Aby przekonać się, skompilować ten moduł do Assembler i obserwowania że zakomentowanie linię CMyClass mClass2(); wytworzy.)

+1

Również prawidłowy konstruktor ruchu. – Arafangion

+0

Dziękuję bardzo. :) – R4D4

10

Ponieważ jest deklarowania funkcji, a nie wywołanie konstruktora, jak myślisz.

Nazywa się to jako Most Vexing Parse w języku C++.

CMyClass mClass2(); 

deklaruje funkcję mClass2() która przyjmuje żadnych parametrów i zwraca CMyClass

+0

** Najbardziej irytująca parse ** - nie mogę powiedzieć, że kiedykolwiek wcześniej o tym słyszałem, przyjrzę się temu, dziękuję. :) – R4D4

+0

@ R4D4: Dodano link, abyś mógł spojrzeć w górę :) –

1

Drugim jest deklaracja funkcji.

Powiązane problemy