2008-10-12 4 views
99

Очень просто поставить:неразрешенный внешний символ на статические члены класса

У меня есть класс, который состоит в основном из статичных публичных членов, так что я могу группировать схожие функции вместе, которые еще должны быть вызваны из других классов/функций.

В любом случае, я определил две статические переменные без знака в общедоступной области моего класса, когда я пытаюсь изменить эти значения в конструкторе того же класса, я получаю ошибку «неразрешенный внешний символ» при компиляции.

class test { 

    public: 

     static unsigned char X; 
     static unsigned char Y; 

     ... 

     test(); 
}; 

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

Я новичок в C++, поэтому легко на меня. Почему я не могу это сделать?

ответ

112

Вы забыли добавить определения в соответствии с вашими декларации X и Y

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

где-то. Вы можете также инициализировать статический член

unsigned char test::X = 4; 

и снова, вы делаете что в определении (обычно в файле CXX) не в декларации (что часто в файле .h)

+1

Если вы пишете библиотеку заголовка только, вы можете использовать эту технику, чтобы избежать CPP файла: http://stackoverflow.com/questions/11709859/how-to-have-static -data-члены-в-а-заголовок-только-библиотека – ShitalShah 2016-11-18 18:49:23

54

Объявления статических данных в объявлении класса не являются их определением. Чтобы определить их, вы должны сделать это в файле .CPP, чтобы избежать дублирования символов.

Единственные данные, которые вы можете объявить и определить, являются интегральными статическими константами. (Значения enums могут быть использованы в качестве постоянных величин, а)

Вы можете переписать код, как:

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

test::test() { 
} 

Если вы хотите, чтобы иметь возможность изменять вам статические переменные (другими словами, когда неуместно объявлять их как константы), вы можете отделить вас код между .H и .CPP следующим образом:

.Н:

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. 
} 
Смежные вопросы