2009-12-29 18 views
6

Tengo una pequeña clase llamada Stuff en la que quiero guardar cosas. Estas cosas son una lista de tipo int. A lo largo de mi código en las clases que uso, quiero poder acceder a estas cosas dentro de la clase Material.¿Por qué no vinculará mi programa C++ cuando mi clase tiene miembros estáticos?

Main.cpp:

#include "Stuff.h" 

int main() 
{ 
    Stuff::things.push_back(123); 
    return 0; 
} 

Stuff.h:

#include <list> 

class Stuff 
{ 
public: 
    static list<int> things; 
}; 

pero me da algunos errores de generación con este código:

error LNK2001: símbolo externo sin resolver "público : static std std :: list < int, class std :: allocator <int> > Stuff :: things "(? Things @ Stuff @@ 2V? $ List @ HV? $ Allocator @ H @ std @@@ std @@ A) Main.obj CSandbox

error fatal LNK1120: 1 elementos externos no resueltos C : \ Stuff \ Projects \ CSandbox \ Debug \ CSandbox.exe CSandbox

Soy un chico C#, y estoy tratando de aprender C++ para un proyecto paralelo. Creo que no entiendo cómo C++ trata a los miembros estáticos. Así que por favor explica lo que tengo mal aquí.

+0

¿Puedo sugerir políticamente que intente formatear la muestra del código? :-) – stiank81

+0

Lo haría, si supiera cómo, aunque me doy cuenta de que Greg tuvo la amabilidad de hacerlo por mí –

+0

iba a poner mis respuestas y ... 2 nuevas respuestas. Solo porque lo sabía. – Hai

Respuesta

15

La mención de un miembro estático en una declaración de clase es una declaración solamente. Debe incluir una definición de del miembro estático para que el enlazador conecte todo correctamente. Lo normal es que incluir algo como lo siguiente en un archivo Stuff.cpp:

#include "Stuff.h" 

list<int> Stuff::things; 

Asegúrese de incluir en su programa Stuff.cpp junto con Main.cpp.

+0

@Greg - eso debería ser 'list Stuff :: things;' –

+0

Gracias, acabo de notar y solucionado eso :) –

7

Los miembros de datos estáticos deben definirse fuera de las declaraciones de clase, al igual que los métodos.

Por ejemplo:

class X { 
    public: 
     static int i; 
}; 

también debe tener lo siguiente:

int X::i = 0; // definition outside class declaration 
4

Stuff :: las cosas sólo se declara, pero no se define.

por favor utilice:

// Stuff.cpp 
#include "Stuff.h" 

std::list<int> Stuff::things; 

Agregado: también es una buena práctica para proteger sus archivos de cabecera contra múltiples inclusión:

// Stuff.h 
#ifndef STUFF_H_ 
#define STUFF_H_ 

#include <list> 

class Stuff { 
    public: 
     static std::list<int> things; 
}; 

#endif 
0

Miembro estático tendrá que ser declarada en la clase, pero definido en la unidad (archivo cpp) donde está realmente ubicado.

La única excepción es en el caso de que la clase sea plantilla: en este caso debe definir el miembro fuera de la clase, pero debe proporcionarlo también con la declaración de clase, en el archivo de encabezado.

2

Solo para su información, por qué esto funciona es que en C++ se crean todas las variables globales (incluida la global estática) antes de que comience la ejecución de la función principal.

Cuestiones relacionadas