2015-03-16 1 views
1

Я новичок в C++ и до сих пор в процессе обучения фазы, так что это может быть простой и, возможно, глупый вопрос к вам, (C++ Статический класс член Инициализация

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

Однако возможно ли инициализировать функцию-член как глобальную переменную в main.cpp? Поскольку все объекты должны делиться одним статическим элементом данных, почему бы просто не инициализировать его там? (я бы подумал, инициализируя его в самой себе, но я бы предположил, что это выплюнет ошибку компиляции)

Не могли бы вы объяснить, если это технически не правдоподобно или просто не сделано традиционно. Так как статический член данных инициализирован в файле cpp класса как глобальная переменная в любом случае, я не вижу причины, по которой инициализация его в главном cpp завершится с ошибкой. Пожалуйста, порекомендуйте.

+0

Возможный дубликат [Инициализация частных статических членов] (http://stackoverflow.com/questions/185844/initializing-private-static-members) – xmoex

+0

Вам необходимо инициализировать вне класса: http: //www.learncpp. com/cpp-tutorial/811-static-member-variables/'int Something :: s_nValue = 1;' –

+0

Подумайте дважды, прежде чем использовать статические члены, если они не являются константами. Ловушки, с которыми вы можете столкнуться, включают SIOF и условия гонки. Последний применяется только тогда, когда вы или кто-то еще хотите делать что-то параллельно с вашим классом. – user877329

ответ

1

Пусть следующий файл заголовка class.hpp

#pragma once // sort of portable 
struct C // to make the example shorter. 
{ 
    static int answer; 
}; 

и после исходного файла class.cpp

#include "class.hpp" 
// nothing here 

и следующий основной источник файла main.cpp

#include <iostream> 
#include "class.hpp" 
int C::answer = 42; 
int main() 
{ 
    std::cout << "And the answer is " << C::answer << "." << std::endl; 
} 

Теперь, компилировать class.cpp -> class.obj, main.cpp -> main.obj, и ссылка class.obj main.obj -> executable. Он работает так, как ожидалось. Но предположим, вы придумали другой проект (anothermain.cpp), который будет использовать тот же class.hpp.

#include "class.hpp" 
int main() 
{ 
    std::cout << "And the answer is " << C::answer << "." << std::endl; 
} 

Проходя же результаты процесса компиляции ошибочными ссылка

неразрешенный внешний символ ": публичный статический Int C :: ответ"

Таким образом, чтобы ответить на ваш вопрос. Возможно. Компоновщику не важно, какой файл объекта содержит определение для этого значения (если он определен только один раз). Однако я бы не рекомендовал его.