2009-02-03 12 views
2

J'ai une classe composée de plusieurs champs, et j'ai plusieurs constructeurs. J'ai aussi un constructeur qui ne prend pas de paramètres, mais lorsque je tente de l'utiliser:Comportement étrange dans le constructeur

int main { 
    A a; 
} 

Le compilateur génère une erreur, alors que si je l'utilise comme ceci:

int main { 
    A a(); 
} 

Il est D'accord. Qu'est-ce que c'est?

Merci

Répondre

11

Le premier main utilise le constructeur par défaut d'un. Le second déclare une fonction qui ne prend aucun paramètre et retourne une valeur A par, ce qui n'est probablement pas ce que vous voulez. Alors, à quoi ressemble la définition de A et quelle est l'erreur que le compilateur génère?

Oh, et vous devez fournir une liste de paramètres dans la déclaration de la principale: int main() { //..., non int main { //...

2

par OK vous dire qu'il compile ou que cela fonctionne? La ligne de code:

A a(); 

est une déclaration (ou prototype) d'une fonction appelée a qui ne prend aucun paramètre et retourne un objet de type A.

Je pense que pour toute personne ayant une chance de vous aider avec votre vrai problème, vous aurez besoin d'afficher au moins la déclaration pour class A.

0

Vous avez tous les deux raison, j'ai eu un problème à l'intérieur la classe.

1

Charles et Michael Burr ont tous deux identifié que la deuxième déclaration était en fait un prototype de fonction et non une instanciation de A.

que pour des raisons possibles pour lesquelles votre premier extrait de code ne fonctionne pas, vous obtiendrez une erreur de compilation dans cette situation lorsque:

  1. classe A hérite d'une classe de base qui n'a pas de constructeur par défaut; OU
  2. La classe A contient des objets de types qui n'ont pas de constructeur par défaut; OU
  3. La classe A contient des membres de référence;

ET

Vous avez fourni un constructeur par défaut qui omet une ou plusieurs de ces sous-objets de sa liste d'initialiseur.

Tous ces sous-objets ont besoin d'être initialisés, et le constructeur par défaut produit par le compilateur ne le fera pas. Notez que dans tous les cas, vous devez les initialiser dans la liste d'initialiseurs, pas le corps du constructeur.