Domanda

In parole povere:

Ho una classe che consiste principalmente di membri pubblici statici, quindi posso raggruppare funzioni simili che devono ancora essere chiamate da altre classi / funzioni.

Comunque, ho definito due variabili statiche senza segno statiche nel mio ambito pubblico di classe, quando provo a modificare questi valori nel costruttore della stessa classe, sto ottenendo un simbolo esterno non risolto " errore durante la compilazione.

class test 
{
public:
    static unsigned char X;
    static unsigned char Y;

    ...

    test();
};

test::test() 
{
    X = 1;
    Y = 2;
}

Sono nuovo di C ++ quindi andate piano con me. Perché non posso farlo?

È stato utile?

Soluzione

Hai dimenticato di aggiungere le definizioni per abbinare le tue dichiarazioni di X e Y

unsigned char test::X;
unsigned char test::Y;

da qualche parte. Potresti voler inizializzare anche un membro statico

unsigned char test::X = 4;

e ancora, lo fai nella definizione (di solito in un file CXX) non nella dichiarazione (che spesso si trova in un file .H)

Altri suggerimenti

Le dichiarazioni dei membri di dati statici nella dichiarazione di classe non sono una loro definizione. Per definirli dovresti farlo nel file .CPP per evitare simboli duplicati.

Gli unici dati che puoi dichiarare e definire sono costanti statiche integrali. (I valori di enums possono essere usati anche come valori costanti)

Potresti voler riscrivere il tuo codice come:

class test {
public:
  const static unsigned char X = 1;
  const static unsigned char Y = 2;
  ...
  test();
};

test::test() {
}

Se vuoi avere la possibilità di modificare le tue variabili statiche (in altre parole quando è inappropriato dichiararle come const), puoi separare il tuo codice tra .H e .CPP nel modo seguente:

.H:

class test {
public:

  static unsigned char X;
  static unsigned char Y;

  ...

  test();
};

.CPP:

unsigned char test::X = 1;
unsigned char test::Y = 2;

test::test()
{
  // constructor is empty.
  // We don't initialize static data member here, 
  // because static data initialization will happen on every constructor call.
}

Dato che questo è il primo thread SO che mi è sembrato utile quando cercavo "esterni non risolti con membri const statici" in generale, lascerò un altro suggerimento per risolvere un problema con esterni non risolti qui:

Per me, la cosa che ho dimenticato era di contrassegnare la mia definizione di classe __declspec (dllexport) , e quando chiamato da un'altra classe (al di fuori dei confini della dll di quella classe), ovviamente ho ottenuto il mio irrisolto errore esterno.
Tuttavia, è facile dimenticare quando si cambia una classe di supporto interna in una classe accessibile da un'altra, quindi se si lavora in un progetto collegato dinamicamente, è possibile verificarlo anche.

nel mio caso, ho dichiarato una variabile statica nel file .h, come

//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}

e in myClass.cpp, ho provato ad usare questo m_nMyVar. Ha ottenuto un errore LINK come:

errore LNK2001: simbolo esterno non risolto " pubblico: classe statica ... Il file cpp relativo all'errore di collegamento è simile a:

//myClass.cpp
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

Quindi aggiungo sotto il codice nella parte superiore di myClass.cpp

//myClass.cpp
int myClass::m_nMyVar; //it seems redefine m_nMyVar, but it works well
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

quindi LNK2001 non c'è più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top