5

Sto scrivendo del codice in cui ho bisogno di avere una variabile di classe che sia un array int statico. Capisco che posso fare questo con qualcosa di simile nel file di intestazione, Ah:variabile di classe array statico "multiple definition" C++

#ifndef A_H_ 
#define A_H_ 

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

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

#endif 

Questo funziona bene se sto quindi compresa questa intestazione in un solo altro file, qualcosa di simile a quanto segue, principale. 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; 
} 

Ma supponiamo che ho bisogno della mia classe a ad essere un po 'più complicato, e voglio avere file come pure un A.cpp. Terrò il mio file main.cpp lo stesso, ma poi cambiare Ah come segue (Ho appena aggiunto una funzione, StampaÂ):

#ifndef A_H_ 
#define A_H_ 

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

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

#endif 

E poi nel file di 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; 

} 

Compilare Ao con gcc -o Ao -c A.cpp va bene. Ma il collegamento di questo quando si compila main.cpp (gcc -o atest main.cpp A.o) fallisce con "definizione multipla di` A :: a '".

Ho setacciato Internet per trovare soluzioni e ho trovato persone che hanno dichiarato variabili nelle intestazioni che ricevono l'errore "a definizione multipla" quando includono l'intestazione in più posizioni e la soluzione sembra essere quella di dichiarare il extern variabile nell'intestazione, quindi definirlo in un solo file sorgente (non di intestazione). Ma non posso dichiarare una variabile di classe sia statica che esterna, posso? Se provo, o se lo dichiaro extern, ricevo un avvertimento sulla variabile che non è statica (anche un errore "specifiers in conflitto" quando provo entrambi).

Quindi, la mia domanda: è possibile avere variabili di classe dell'array statico nel caso in cui il file di intestazione debba essere incluso in più di un file sorgente? Se é cosi, come?

risposta

17

Si sta violando la regola una definizione. Spostare la definizione all'interno di un file di implementazione:

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

La soluzione che si sta ammissibili per prova a, con extern, si applica alle variabili terzi. Nel tuo caso a è un membro della classe.

7

È necessario rimuovere "const int A :: a [] = {1,2};" linea dal file di intestazione. Metti questa linea di definizione in uno dei tuoi file .cpp. Quindi puoi includere il file di intestazione più volte dove ti serve.