2010-09-28 5 views
19

Dieser Code verhält sich nicht wie ich es erwarte.Warum wird der Konstruktor nicht aufgerufen?

Ich erwartete die Ausgabe 'Standardkonstruktor genannt', aber ich sah nichts als die Ausgabe. Was ist das Problem?

+3

Ihr Konstruktor privat ist. –

+2

@ribeas: Das ist nicht wirklich der ärgerlichste Parse; es ist nur ein leicht ärgerlicher Parse. Das "am meisten ärgerliche Parse" ist normalerweise reserviert für den Versuch, eine Variable mit einem Direktinitialisierer eines initialisierten temporären Wertes zu erzeugen: 'A a (A());' (Mein Fehler ursprünglich.) –

+0

siehe auch http://stackoverflow.com/questions/180172/default-constructor-with-empty-brackets –

Antwort

17

Kein Anruf

Da der Konstruktor Konstruktor wird eigentlich nie genannt.

Class object(); als Deklaration einer Funktion object nimmt kein Argument und Rückkehr ein Objekt von Class [von value]

Class object;

EDIT Versuchen interpretiert:

Als Mike dies bemerkt ist nicht genau der Code, den Sie dem Compiler geben. Ist der Konstruktor/Destruktor public oder ist Class eine Struktur?

Allerdings google für C++ am meisten ärgerlichen Parse.

+0

Ich bekam die Antwort einen Moment vor mir _und_ umformatierte die Post. +1 – JoshD

+0

Danke @JoshD :) –

31

Nein. Ihre Zeile Class object(); Wurde zu einer Funktion erklärt. Was Sie schreiben möchten, ist Class object;

Probieren Sie es aus.

Sie könnten auch an der am meisten ärgerlichen Analyse interessiert sein (wie andere bemerkt haben). Ein gutes Beispiel ist in Effective STL Punkt 6 auf Seite 33. (Im zwölften Druck, September 2009.) Insbesondere das Beispiel oben auf Seite 35 ist, was Sie getan haben, und es erklärt, warum der Parser es als eine Funktionsdeklaration behandelt.

+1

+1, BTW Visual C++ - Probleme 'Warnung C4930: prototyped Funktion nicht aufgerufen (war eine variable Definition gemeint?)' In solchen Fällen. – sharptooth

+1

Ist das wirklich das "ärgste Parse"? Ich dachte immer, der Satz bezog sich auf das frustrierendere Problem, dass 'T x (T())' eine Funktionsdeklaration ist. –

+0

@James McNellis: So nannte Scott Meyers es. Ich stimme nicht genau zu, und ich habe diese Frage nicht sofort damit verbunden. Ich denke, dein Beispiel ist viel häufiger und frustrierender. – JoshD

0

Sie können es wie folgt verwenden:

Class obj; 
//or 
Class *obj = new Class(/*constructor arguments*/);