2009-05-11 8 views
0

Je travaille sur une affectation de classe qui a commencé petit, donc je l'ai eu tous dans un fichier. Maintenant, il est devenu plus grand et j'essaie de compiler séparément main, fonctions et classes (donc toutes les classes sont ensemble dans un .h et un .cpp) J'ai une classe B, qui est le parent de beaucoup d'autres et vient en premier dans le fichier. Un de ses membres de données ne fonctionne pas maintenant que j'utilise la compilation séparée, ce qui provoque des dizaines d'erreurs.C++ question ... définition ne reconnaît pas les vecteurs spécifiés dans la déclaration

Dans .h

class A; 
class B { 
public: 
    B(){} 
    A* myptr; 
    void whatever(); 
    vector<A*> myAs; //this one is the problem 
}; 

Dans Cpp

void B::whatever() { 
    vector<A*> newvector; //no problem! 
    myptr = &something; //no problem! 
    for (vector<A*>::iterator iter = myAs.begin(); iter != myAs.end(); ++iter) { 
     //error! 
    } 
} 

Je reçois des erreurs: soit "Myas n'a pas été déclaré dans ce cadre" ou "classe B n'a pas Myas membres."

J'ai inclus < vector>, classe A déclarée comme vous le voyez ci-dessus, et je me suis définitivement souvenu d'inclure le .h en haut du fichier .cpp! Y at-il quelque chose à propos des vecteurs ou des classes et de la compilation séparée que je ne comprends pas? C'est dans Xcode, BTW.

+0

Y at-il un message d'erreur associé à la ligne de code dans l'en-tête qui déclare myAs? Ou y a-t-il seulement un message d'erreur associé à la ligne de code dans le fichier CPP qui utilise myAs? – ChrisW

+0

En passant, je vous recommande fortement de mettre du code dans le destructeur qui supprime les objets pointés par A * dans myAs car c'est une fuite de mémoire qui se produirait autrement. –

Répondre

4

Ce n'est pas seulement vector. C'est std::vector parce que c'est dans l'espace de noms appelé std. C'est pourquoi le compilateur gémit. Il ne sait pas ce que signifie vector<A*>. Dites std::vector<A*> à la place.

Est-ce que ne pas ajouter using namespace std; maintenant dans l'en-tête à cause de cela. Il peut être OK pour l'affectation de le mettre dans le fichier .cpp pour enregistrer la frappe si vous le souhaitez. Mais c'est une très mauvaise idée de mettre une telle ligne dans un en-tête: parce que vous ne savez pas quels fichiers auront besoin de votre en-tête à l'avenir. La situation peut rapidement devenir incontrôlable car le nombre de fichiers, y compris votre en-tête, augmente avec le temps. L'en-tête devrait donc inclure seulement les noms et les en-têtes dont il a réellement besoin pour qu'il provoque le moins possible de conflits de noms - alors que cette ligne using namespace std; rendrait tous les noms de std directement visibles.

+0

Vous avez identifié l'un de mes animaux de compagnie (les programmeurs qui utilisent la déclaration dans les fichiers d'en-tête). +1 –

+0

Merci! Je ne peux pas croire que je n'y ai pas pensé, parce que j'ai * réalisé * que je devais changer de chaîne en std :: string. Je n'avais aucune idée que le vecteur était soumis à la même chose. – eom