5

Escribo código donde necesito tener una variable de clase que sea una matriz int estática. Yo entiendo que yo puedo hacer esto con algo como esto en el archivo de cabecera, Ah:variable de clase de matriz estática "definición múltiple" C++

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

Esto funciona bien si estoy a continuación, incluyendo esta cabecera sólo en otro archivo, algo así como lo siguiente, principal. CPP:

#include "A.h" 

#include <iostream> 
using namespace std; 

int main() 
{ 

    A myA; 
    cout << "0: " << myA.a[0] << endl; 
    cout << "1: " << myA.a[1] << endl; 
} 

Pero supongamos que necesito mi clase a a ser un poco más complicado, y yo quiero tener un archivo de a.cpp también. Voy a mantener mi archivo main.cpp lo mismo, pero luego cambio de Ah de la siguiente manera (Acabo de añadir una función, ImpresiónÂ):

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    void printA() const; 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

Y luego en el archivo a.cpp:

#include "A.h" 

#include <iostream> 
using namespace std; 

void A::printA() const 
{ 

    cout << "Printing in A.cpp." << endl; 
    cout << "A.0: " << a[0] << endl; 
    cout << "A.1: " << a[1] << endl; 

} 

Compilando Ao con gcc -o Ao -c A.cpp está bien. Pero vincular esto al compilar main.cpp (gcc -o atest main.cpp A.o) falla con "definición múltiple de` A :: a '".

He estado buscando en internet soluciones, y he encontrado personas que tienen variables declaradas en sus encabezados que reciben el error de "definición múltiple" cuando incluyen el encabezado en varios lugares, y la solución parece ser declarar el variable extern en el encabezado, luego defínalo solo en un archivo de origen fuente (no encabezado). Pero no puedo declarar una variable de clase tanto estática como externa, ¿verdad? Si lo intento, o si solo lo declaro extern, recibo una advertencia acerca de que la variable no es estática (también un error de "especificadores en conflicto" cuando intento ambos).

Entonces, mi pregunta: ¿es posible tener variables de clase de matriz estática en el caso de que el archivo de encabezado deba incluirse en más de un archivo fuente? ¿Si es así, cómo?

Respuesta

17

Está infringiendo la regla de definición one. Mover la definición dentro de un archivo de implementación:

//A.cpp 
#include "A.h" 
const int A::a[] = {1,2}; 

La solución que según los planes de, la extern, se aplica a las variables que no son miembros. En su caso a es un miembro de la clase.

7

Debería eliminar "const int A :: a [] = {1,2};" línea desde el archivo de encabezado. Coloque esta línea de definición en uno de sus archivos .cpp. Luego puede incluir el archivo de encabezado varias veces donde lo necesite.

Cuestiones relacionadas