Неразрешенный внешний символ на статических членах класса
очень просто:
У меня есть класс, который состоит в основном из статических открытых членов, поэтому я могу группировать подобные функции вместе, которые все еще должны вызываться из других классов/функций.
в любом случае, я определил две статические беззнаковые переменные char в моей публичной области класса, когда я пытаюсь изменить эти значения в конструкторе того же класса, я получаю ошибку "неразрешенный внешний символ" при компиляции.
class test
{
public:
static unsigned char X;
static unsigned char Y;
...
test();
};
test::test()
{
X = 1;
Y = 2;
}
Я новичок в C++, так что полегче мне. Почему я не могу этого сделать?
4 ответов:
вы забыли добавить определения, соответствующие вашим объявлениям X и Y
unsigned char test::X; unsigned char test::Y;куда-то. Вы можете также инициализировать статический элемент
unsigned char test::X = 4;и снова вы делаете это в определении (обычно в файле CXX), а не в объявлении (которое часто находится в a .Файл ч)
объявления членов статических данных в объявлении класса не являются их определением. Чтобы определить их, вы должны сделать это в
.CPPфайл, чтобы избежать дублирования символов.единственные данные, которые вы можете объявить и определить, это интегральные статические константы. (Значения
enumsможно использовать и в качестве постоянных значений)вы можете переписать свой код как:
class test { public: const static unsigned char X = 1; const static unsigned char Y = 2; ... test(); }; test::test() { }если вы хотите иметь возможность изменять статические переменные (другими словами, когда это неуместно объявлять их как const), вы можете разделить код между
.Hи.CPPследующим образом:.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. }
поскольку это первый поток SO, который, казалось, подошел для меня при поиске "неразрешенных внешних элементов со статическими членами const" в целом, я оставлю еще один намек на решение одной проблемы с неразрешенными внешними элементами здесь:
для меня, то, что я забыл, чтобы отметить мое определение класса
__declspec(dllexport), и при вызове из другого класса (вне границ dll этого класса), я, конечно, получил мою неразрешенную внешнюю ошибку.
Тем не менее, легко забыть, когда вы меняетесь внутренний вспомогательный класс для одного доступного из других источников, поэтому, если вы работаете в динамически связанном проекте, вы также можете проверить это.
в моем случае я объявил одну статическую переменную .H-файл, как
//myClass.h class myClass { static int m_nMyVar; static void myFunc(); }и в myClass.cpp, я пытался использовать этот m_nMyVar. Он получил ссылку ошибка, как:
ошибка LNK2001: неразрешенный внешний символ " public: static class... Файл cpp, связанный с ошибкой ссылки, выглядит так:
//myClass.cpp void myClass::myFunc() { myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error }поэтому я добавляю ниже код в верхней части 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 }затем LNK2001 ушел.
Comments