Frage

Sehr einfach ausgedrückt:

Ich habe eine Klasse, die hauptsächlich aus statischen öffentlichen Mitgliedern besteht, so kann ich Gruppe ähnliche Funktionen zusammen, die immer noch von anderen Klassen / Funktionen aufgerufen werden.

Wie auch immer, habe ich zwei statische unsigned char Variablen definiert in meiner Klasse öffentlichen Rahmen, wenn ich versuche, diese Werte in der gleichen Klasse Konstruktor zu ändern, ich bin eine ‚nicht aufgelöstes externes Symbol‘ Fehler bei der Kompilierung zu bekommen.

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

    ...

    test();
};

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

Ich bin neu in C ++ so einfach auf mich gehen. Warum kann ich das tun?

War es hilfreich?

Lösung

Sie haben vergessen, die Definitionen hinzufügen, um Ihre Erklärungen von X und Y entsprechen

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

irgendwo. Vielleicht möchten Sie auch ein statisches Element initialisieren

unsigned char test::X = 4;

und wieder, was Sie tun, dass in der Definition (in der Regel in einer CXX-Datei) nicht in der Erklärung (die oft in einer .H-Datei)

Andere Tipps

Statische Datenelemente Erklärungen in der Klassendeklaration nicht Definition von ihnen. Um sie zu definieren Sie sollten dies tun, in der .CPP Datei duplizierten Symbole zu vermeiden.

Die einzigen Daten, die Sie erklären können und definieren sind ein integrale Bestandteil statische Konstanten. (Werte von enums kann als konstante Werte verwendet werden, als auch)

Vielleicht möchten Sie den Code neu zu schreiben wie:

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

test::test() {
}

Wenn Sie die Fähigkeit haben wollen Sie statische Variablen zu ändern (in anderen Worten, wenn es nicht angebracht ist, sie als const zu deklarieren), können Sie trennen Code zwischen .H und .CPP auf folgende Weise:

· 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.
}

Da dies der ersten SO Faden ist, der für mich schien zu kommen, wenn für „nicht aufgelöste externe mit statischen const Mitgliedern“ in der Regel der Suche, ich werde ein weiteren Hinweis hinterlässt ein Problem mit nicht aufgelösten externen löse sie hier:

Für mich ist die Sache, die ich war vergessen, meine Klassendefinition __declspec(dllexport) zu markieren, und wenn sie von einer anderen Klasse aufgerufen (außerhalb dieser Klasse der DLL Grenzen), ich natürlich bekam die meine nicht aufgelösten externen Fehler.
Trotzdem leicht zu vergessen, wenn Sie eine interne Hilfsklasse zu einem einem zugänglichen von anderswo sind zu ändern, wenn Sie also in einem dynamisch verknüpften Projekt arbeiten, können Sie auch, dass der Check auch.

in meinem Fall, erklärte ich eine statische Variable in .h-Datei, wie

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

und in MyClass.cpp habe ich versucht, diese m_nMyVar zu verwenden. Es wurde LINK Fehler wie:

Fehler LNK2001: extern Symbol „public: static Klasse ... Die Link-Fehler im Zusammenhang CPP-Datei wie folgt aussieht:

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

Also ich Code unten auf der Spitze MyClass.cpp hinzufügen

//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
}

dann wird LNK2001 gegangen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top