Нужно ли копировать статический член в конструктор копирования, и если да, то как это сделать?

У меня есть класс с контейнером, который объявлен статическим:

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/

Если вы не хотите обращаться к статической переменной во всех экземплярах класса, нет необходимости объявлять ее статической.

Другие вопросы по тегам