2010-10-24 22 views
6

Je rencontre des problèmes lors de l'accès à une propriété statique dans une classe. Je reçois l'erreur suivante:C++, propriété statique

shape.obj : error LNK2001: unresolved external symbol "public: static class TCollection<class Shape *> Shape::shapes"

La définition de la classe est:

class Shape { 

public: 
    static Collection<Shape*> shapes; 

    static void get_all_instances(Collection<Shape*> &list); 
}; 

et la mise en œuvre de la méthode statique étant:

void Shape::get_all_instances(Collection<Shape*> &list) { 
    list = Shape::shapes; 
} 

Il semble que le La propriété shapes n'est pas en cours d'initialisation.

+0

Wow merci pour le retour rapide. J'ai pris des heures pour faire de la recherche et environ 1 minute sur StackOverflow. – Louis

+0

Je pense que vous regretterez beaucoup d'avoir à la fois une variable statique et une variable publique. As-tu réellement besoin de cela? Pourquoi ne pas simplement passer une const Collection & objet partout où vous avez besoin d'une liste de toutes les formes? Cela encouragera les autres développeurs à appeler Shape :: get_all_instances() dès qu'ils auront besoin de la liste, au lieu de la passer explicitement. Cela conduira à toutes sortes de problèmes, lorsque vous voulez tester ou que vous voulez travailler sur des sous-formes de formes. –

+0

Ouais c'est public en ce moment à cause d'un débogage furieux. – Louis

Répondre

10

Vous avez raison puisque la variable statique ne sont déclarés dans la classe et non définie.

devez les définir aussi, ajoutez simplement la ligne suivante dans le fichier où se trouve votre implémentation.

Collection<Shape*> Shape::shapes; 

Et ça devrait faire l'affaire.

7

Oui. Vous devez ajouter

Collection<Shape*> Shape::shapes; 

dans l'un des fichiers .cpp pour définir le membre statique.

3

la déclaration est dans la classe.

la définition doit être placé dans exactement un fichier cpp:

Collection<Shape*> Shape::shapes; 
5

Vous avez déclaré shapes mais n'ont pas définir.

Ajouter la définition dans le fichier de mise en œuvre

Collection<Shape*> Shape::shapes; //definition 
4

Pour le code tel quel, vous devez fournir une définition de shapes, comme (dans un fichier de mise en œuvre)

Collection<Shape*> Shape::shapes(whatever constructor args); 

Mais au contraire, vous voudrez peut-être envisager une fonction membre qui retourne une référence à une locale statique Collection<Shape*>.

Salutations & hth.