2010-10-24 17 views
6

Tengo problemas para acceder a una propiedad estática en una clase. Estoy consiguiendo el error siguiente:C++ Static Propiedad

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

La definición de la clase es:

class Shape { 

public: 
    static Collection<Shape*> shapes; 

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

Y la aplicación del método de ser estática:

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

parece que el La propiedad shapes no se está inicializando.

+0

¡Gracias por los comentarios rápidos! Tomó horas investigar y aproximadamente 1 minuto en StackOverflow. – Louis

+0

Creo que lamentará tanto tener una variable estática como tener una variable pública. ¿En serio necesitas eso? ¿Por qué no simplemente pasas una colección const & object donde sea que necesites una lista de todas las formas? Esto alentará a otros desarrolladores a llamar a Shape :: get_all_instances() cada vez que necesiten la lista, en lugar de pasarla explícitamente. Esto dará lugar a todo tipo de problemas, cuando desee probar o desee operar en sublistas de formas. –

+0

Sí, es público en este momento debido a la depuración furiosa. – Louis

Respuesta

10

Tienes razón ya variables estáticas se declaran sólo dentro de la clase y no definido.

Usted debe definirlos también, simplemente agregue la siguiente línea en el archivo donde está su implementación.

Collection<Shape*> Shape::shapes; 

Y debería hacer el truco.

7

Sí. Debe agregar

Collection<Shape*> Shape::shapes; 

en uno de los archivos .cpp para definir el miembro estático.

3

la declaración es en la clase.

la definición debe ser colocado en el archivo exactamente un CPP:

Collection<Shape*> Shape::shapes; 
5

Se han declarado shapes pero no lo han definido.

Añadir la definición para el archivo de implementación

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

Para el código tal cual es necesario proporcionar una definición de shapes, al igual que (en un archivo de aplicación)

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

Pero en cambio es posible que desee considerar una función miembro que devuelve una referencia a un local de estático Collection<Shape*>.

Cheers & hth.