10
votes

Déclaration en avant de la classe, fonction

Lorsque les déclarations de fonctions fonctionnent dans un fichier source (.CPP), pourquoi la même chose ne fonctionne pas pour les cours?

merci. xxx


2 commentaires

Classe One; est la syntaxe correcte pour une déclaration de classe avant. Quel message d'erreur compilateur obtenez-vous exactement?


Erreur: utilisation invalide d'un type incomplet struct unique; Je cours sur Mac


6 Réponses :


3
votes

Placez votre déclaration de membre de votre classe avant les implémentations membres.

class One {

 public:
  void anyAccess() ;
  static int statVar ;

 private:
  int  classVar ;

} ;

int One:: statVar = 10 ;

void
One :: anyAccess() {

 std::cout << "\n statVar:\t " << statVar ;
 std::cout << "\n classVar:\t" << classVar ;
}


0 commentaires

5
votes

La déclaration à terme la classe 1; vous permet de vous référer à la classe mais pas à aucun de ses membres. Vous devez mettre toutes les définitions des membres de la classe après la déclaration complète de la classe. (Ou à l'intérieur, bien sûr.)


0 commentaires

2
votes

Vous obtenez le message d'erreur sur int one :: statvar = 10; pas sur la déclaration en avant, qui va bien.

Le compilateur doit connaître la définition complète de la classe avant de pouvoir définir des membres statiques comme celui-ci - une déclaration à terme est insuffisante (elle doit être capable de confirmer que le type est correct de la définition de la classe).

Vous devrez déplacer votre définition d'attribut statique sous la définition de la classe.


0 commentaires

12
votes

La déclaration à terme peut aussi fonctionner pour les cours aussi:

class Foo;

class Bar {
public:
    Foo *myFoo; // This has to be a pointer, thanks for catching this!
};

class Foo {
public:
    int value;
};


3 commentaires

AFAIK, les déclarations avant ne vous laissent pas avoir d'objets de la classe ainsi déclaré - seuls les pointeurs et éventuellement des références. Dans votre exemple, le compilateur n'a pas pu savoir Tailleof (FOO) , ce qui rend impossible de définir la barre .


Cela ne compilera pas pour la même raison que le code de OP échoue: vous utilisez FOO avant que sa structure complète ne soit connue (GCC vous indiquera que "le champ" myfoo "a un type incomplet")


N'oubliez pas que vous pouvez également déclarer une référence, n'ayant que le type de ce type, E.g: const foo & myfoo .



2
votes

Le compilateur lit des trucs du début à la fin et génère du code tel quel. (Certains compilateurs peuvent ne pas faire cela, mais ils devraient se comporter comme s'ils le faisaient.) Mais avant la définition de la classe, le compilateur ne sait pas que One :: Statvar OU One :: Anyaccessé devrait exister ou si la fonction est virtuelle, statique ou quoi. Il doit savoir que des choses afin de générer du code.


0 commentaires

0
votes

Lorsque vous créez une fonction de classe et une classe et une classe peut accéder aux données de la classe à une autre classe. alors c'est une fonction d'ami

La déclaration de mot de mot est utilisée pour savoir quelle classe dans la prochaine

classe abc;

classe xyz

{

membre de données;

public:

ami vide getdata ();

autre fonction membre

}

classe ABC

{

Membre de données

public:

ami vide getdata ();

}


0 commentaires