2015-04-10 1 views
0

Я пытаюсь объявить статический объект класса А, что я написал в другом классе В, как это:C++ объявить статический объект в классе

class A // just an example 
{ 
    int x; 
public: 
    A(){ x = 4; } 
    int getX() { return x; } 
}; 

class B 
{ 
    static A obj1; // <- Problem happens here 
public: 
    static void start(); 
}; 

int main() 
{ 
    B::start(); 
} 

void B::start() 
{ 
    int x = obj1.getX(); 
} 

То, что я хочу добиться того, чтобы получите int x в B::start() равным int x в class A (4).

Я пробовал все это за прошлый час, и все, что я понял, было то, что C++ не разрешает объявления статических объектов. Это верно?

Если это так, вот мой вопрос. Как я могу получить тот же результат? Каковы мои доступные обходные пути? Помня о том, что остальная часть моего кода зависит от того, какие функции в классе B статичны.

Ошибка

ошибка LNK2001: неразрешенный внешний символ "частный: статический класс A B :: obj1"

Спасибо!

+2

Вам не хватает определения объекта. Добавьте его за пределы класса: 'A B :: obj1;' – dasblinkenlight

+0

Вы должны включить сообщения об ошибках, которые вы получаете. –

+0

http://stackoverflow.com/a/12574407/962089 – chris

ответ

2

Вы должны инициализировать static var код:

class A // just an example 
{ 
    int x; 
public: 
    A(){ x = 4; } 
    int getX() { return x; } 
}; 

class B 
{ 
    static A obj1; // <- Problem happens here 
public: 
    static void start(); 
}; 

A B::obj1; // init static var 

int main() 
{ 
    B::start(); 
} 

void B::start() 
{ 
    int x = obj1.getX(); 
} 
2

Как thinkerou сказал, что вам нужно включить объявление переменной:

A B::obj1; 

Для обычных, не статических переменных-членов вы не Этот шаг нужен, потому что переменные объявляются за кулисами как часть конструктора. Эти переменные затем привязаны к экземпляру только что построенного класса. Но статические переменные не привязаны ни к одному экземпляру класса; они разделяются всеми экземплярами класса. Поэтому конструкторы не могут с ними справиться должным образом.

C++ обходит это, заставляя вас вручную объявлять (и при необходимости инициализировать) любые статические переменные-члены. В зависимости от того, где они объявлены, они обычно создаются до запуска функции main(), поэтому они доступны для использования немедленно.