2010-02-23 8 views
44

Stavo compilando un programma C++ in Cygwin usando g ++ e avevo una classe il cui costruttore non aveva argomenti. Ho avuto le linee:Non ci sono parentesi su un costruttore senza argomenti uno standard di lingua?

MyClass myObj(); 
myObj.function1(); 

E quando si cerca di compilarlo, ho ricevuto il messaggio:

errore: richiesta di membro 'funzione1' in 'myObj', che è di tipo non-class 'MyClass()() '

Dopo una piccola ricerca, ho trovato che la correzione era quella di cambiare quella prima riga in MyClass myObj;

Potrei giurare che ho già fatto dichiarazioni di costruttore vuote con parentesi in C++. Questa è probabilmente una limitazione del compilatore che sto usando o lo standard del linguaggio dice veramente non usare le parentesi per un costruttore senza argomenti?

risposta

49

Sebbene MyClass myObj(); possa essere analizzato come una definizione di oggetto con un inizializzatore vuoto o una dichiarazione di funzione, lo standard di lingua specifica che l'ambiguità viene sempre risolta a favore della dichiarazione di funzione. Un inizializzatore di parentesi vuoto è consentito in altri contesti, ad es. in un'espressione new o nella costruzione di un valore inizializzato con valore .

1

Lo standard non richiede parentesi.

int* x = new int; 

è la sintassi legale.

Nel tuo caso myclass myobj(); è un prototipo di funzione. Considerando che è una variabile.

3

La linea fa in modo che il compilatore pensi di dichiarare una funzione denominata myObj che non accetta argomenti e restituisce un valore MyClass. Questa risoluzione di ambiguità è davvero fastidiosa.

10

Questo è un problema abbastanza noto, e non è dipendente compilatore. In sostanza, quello che stavi facendo era dichiarare una funzione che restituiva il tipo MyObj. Non sorprendentemente, non è possibile chiamare il suo costruttore. Vedere la C++ faq lite per una buona spiegazione

+0

Espansione: è solo un problema in alcuni contesti. Scrivi "throw myexceptionclass();", ad esempio, e non c'è confusione. Il linguaggio è ambiguo nel contesto di Petes, ma le regole disambiguanti (la ragione per cui il linguaggio non è strettamente ambiguo) scelgono un'interpretazione. Ovviamente le regole disambiguanti significano che la lingua non è davvero ambigua - ma gli esperti di analisi lo dicono comunque, quindi sono autorizzato anche io! Le regole di disambiguazione più comuni in molte lingue sono per la precedenza e l'associatività degli operatori: C e C++ sono molto più ambigui e di conseguenza ci sono alcuni problemi strani. – Steve314

44

questo è chiamato il problema parse più fastidioso. Quando il parser vede

MyClass myObj(); 

Pensa si dichiara una funzione chiamata myObj che non ha parametri e restituisce un MyClass.

Per aggirare l'ostacolo, utilizzare:

MyClass myObj; 
+0

Salve, oltre all'allocazione rispettivamente su stack e heap, c'è qualche differenza tra 'MyClass obj' e' MyClass * obj = new MyClass() '? – SexyBeast

+1

Alcuni. Il primo dichiara 'obj' come un oggetto di tipo' MyClass', e verrà automaticamente liberato quando si esce dall'ambito. Il secondo dichiara 'obj' come un oggetto di tipo' MyClass * ', che deve essere liberato manualmente e sarà disponibile dopo l'uscita dall'ambito. –

+0

Sì, sì, è esattamente il risultato di essere assegnati nello stack e nell'heap rispettivamente, giusto? – SexyBeast

4
MyClass myObj(); 

che è analizzato come una dichiarazione di funzione, la funzione si chiama myObj, non accetta argomenti e restituisce MyClass oggetto. Non ho mai visto un compilatore accettarlo. D'altra parte MyClass* myPtr = new MyClass(); è accettabile, può essere che ti ha confuso?

18

ho trovato questo nella norma (§8.5 C++.8):

An object whose initializer is an empty set of parentheses, i.e.,(), shall be value-initialized.

[Note: since() is not permitted by the syntax for initializer,

X a(); 

is not the declaration of an object of class X, but the declaration of a function taking no argument and returning an X. The form () is permitted in certain other initialization contexts (5.3.4, 5.2.3, 12.6.2). —end note ]

Problemi correlati