Est pas de parenthèses sur un constructeur sans arguments d'une langue standard?
J'ai été la compilation d'un programme C++ dans Cygwin à l'aide de g++ et j'ai eu une classe dont le constructeur a pas d'arguments. J'ai eu l'lignes:
MyClass myObj();
myObj.function1();
Et lorsque j'essaie de compiler, j'ai le message:
error: request for member 'function1' in 'myObj', which is of non-class type 'MyClass ()()'
Après un peu de recherche, j'ai trouvé que la solution était de changer cette première ligne de
MyClass myObj;
Je pourrais jurer que j'ai fait constructeur vide déclarations avec des parenthèses en C++ avant. Est-ce probablement une limitation de le compilateur que j'utilise ou ne la norme du langage vraiment dire ne pas utiliser des parenthèses pour un constructeur sans arguments?
Vous devez vous connecter pour publier un commentaire.
Bien que
MyClass myObj();
pourrait être analysée comme une définition de l'objet avec un vide d'initialiseur ou une déclaration de fonction de la langue standard précise que l'ambiguïté est toujours résolu en faveur de la déclaration de la fonction. Un des parenthèses vides initialiseur est autorisé dans d'autres contextes, par exemple dans unnew
de l'expression ou de la construction d'un valeur initialisée temporaire.Ce qui est appelé la plus délicate à analyser question. Lorsque l'analyseur voit
Il pense que vous êtes la déclaration d'une fonction appelée
myObj
qui n'a pas de paramètre et renvoie uneMyClass
.De la contourner, utilisation:
MyClass obj
etMyClass *obj = new MyClass()
?obj
comme un objet de typeMyClass
, et sera automatiquement libéré lorsque la portée des sorties. Le second déclareobj
comme un objet de typeMyClass*
, qui doit être libéré manuellement, et seront disponibles après la portée du sort.J'ai trouvé ça dans la norme C++ (§8.5.8):
C'est assez bien connue, et n'est pas dépendant du compilateur. Essentiellement, ce que vous faisiez était de déclarer une fonction retournant le type MyObj. Il n'est pas surprenant, vous ne pouviez pas appeler son constructeur. Voir la C++ faq lite pour une bonne explication
Encore un autre plus délicate à analyser frappé. Voir, par exemple, Fonction de tri ne fonctionne pas avec la fonction de l'objet créé sur la pile?
C'est analysée comme une déclaration de fonction, la fonction est appelée myObj, ne prend pas d'arguments et retourne MyClass objet. Je n'ai jamais vu un compilateur d'accepter que. D'autre part
MyClass* myPtr = new MyClass();
est acceptable, peut-être que vous avez perdu?Votre ligne rend le compilateur pense que vous êtes la déclaration d'une fonction nommée
myObj
qui ne prend pas d'arguments et retourne unMyClass
. Cette ambiguïté de la résolution est en effet gênant.Le standard ne nécessitent pas de parenthèses.
est légal de syntaxe.
Dans votre cas
myclass myobj();
est un prototype de fonction. Alors quemyclass myobj;
est une variable.