Нужно ли копировать статический член в конструктор копирования, и если да, то как это сделать?
У меня есть класс с контейнером, который объявлен статическим:
class test {
public:
test(const ClassA& aRef, const std::string& token);
test(const test& src);
~test();
private:
ClassA& m_ObjRef;
static std::vector<std::string> s_toks;
};
Контейнер s_toks инициализируется следующим образом в конструкторе, определенном в test.cpp:
std::vector<std::string> test::s_toks;
test::test(const ClassA& aRef, const std::string& token)
: m_ObjRef(aRef)
{
my_tokenize_function(token, s_toks);
}
test::test(const test& src)
: m_ObjRef(src.m_ObjRef)
{
/* What happens to s_toks; */
}
Если я не копирую s_toks, а s_toks доступен из нового скопированного объекта, он пуст. Какой правильный способ справиться с этим?
3 ответа
Статический член данных не связан ни с одним экземпляром вашего класса. Он существует для всех экземпляров, и попытка изменить его в конструкторе копирования класса не имеет большого смысла (если только вы не используете его для хранения своего рода счетчика экземпляров). К тому же, нет смысла "инициализировать" его в любом из конструкторов классов.
Статический член является общим для всех экземпляров класса, поэтому нет смысла инициализировать его в конструкторе или копировать в конструкторе копирования.
Поддерживая комментарии других людей, эта ссылка дает хорошее объяснение с примерами: http://www.learncpp.com/cpp-tutorial/811-static-member-variables/
Если вы не хотите обращаться к статической переменной во всех экземплярах класса, нет необходимости объявлять ее статической.