2010-10-24 15 views
6

Si verificano problemi durante l'accesso a una proprietà statica in una classe. Sto ottenendo il seguente errore:Proprietà statica C++

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

La definizione della classe è:

class Shape { 

public: 
    static Collection<Shape*> shapes; 

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

E l'attuazione del metodo statico dell'essere:

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

Sembra che il La proprietà shapes non viene inizializzata.

+0

Wow, grazie per il feedback rapido. Ci sono voluti ore per la ricerca e circa 1 minuto su StackOverflow. – Louis

+0

Penso che rimpiangerete molto sia di avere una variabile statica che di avere una variabile pubblica. Ne hai davvero bisogno? Perché non passi semplicemente una collezione const e oggetti ovunque ti serva una lista di tutte le forme? Questo incoraggerà altri sviluppatori a chiamare Shape :: get_all_instances() ogni volta che hanno bisogno dell'elenco, invece di passarlo esplicitamente. Questo porterà a tutti i tipi di problemi, quando vuoi testare o vuoi operare su sottoliste di forme. –

+0

Sì, al momento è pubblico a causa del furioso debugging. – Louis

risposta

10

Hai ragione in quanto variabile statica sono dichiarati solo all'interno della classe e non definito.

È definirli, è sufficiente aggiungere la riga seguente nel file in cui si trova l'implementazione.

Collection<Shape*> Shape::shapes; 

E dovrebbe fare il trucco.

7

Sì. È necessario aggiungere

Collection<Shape*> Shape::shapes; 

in uno dei file .cpp per definire il membro statico.

3

la dichiarazione è nella classe.

la definizione deve essere posto in un file esattamente un cpp:

Collection<Shape*> Shape::shapes; 
5

si è dichiarato shapes ma non hanno definito.

Aggiungere la definizione al file di implementazione

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

Per il codice così com'è è necessario fornire una definizione di shapes, come (in un file di implementazione)

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

Ma invece si potrebbe prendere in considerazione una funzione di membro che restituisce un riferimento a un locale statico Collection<Shape*>.

Cheers & hth.

Problemi correlati