我读了这个好post(在undefined-reference-to-a-static-member上),但是从我能看到的我不总是需要在cpp中定义静态成员。所以我要求帮助理解这些规则。
几个例子 - cpp中没有def的所有例子。 在主要声明类的h文件中是:
class Master{
public:
static IDataSynchronization& sync_data_cb_;
}
在cpp:
void Master::start(IDataSynchronization& syncDataCB); - error for undefined
void Master::start(int p,IDataSynchronization& syncDataCB); no error
//这里用于静态sync_data_cb_ void Master :: sendData(){ list data = sync_data_cb_.syncData(); list :: iterator it; for(it = data.begin(); it!= data.end(); ++ it){ sendto(实例_-&gt; data_sock_fd_,(* it).c_str(),(* it)。length(),0,(const struct sockaddr *)&amp; instance _-&gt; target_host_data_,instance _-&gt; sockadd_length _); < / p>
}
}
这个班级:
class Logger {
public:
static void Log(const char *format, ...);
private:
static FILE* file_;
static mutex mtx_;
};
如果在另一个我声明静态静态FILE *的类中(并在类方法中使用它)我没有得到未定义的错误。
我在所有情况下都在这些静态记忆中使用。
任何人都可以为我清除统治者吗?
谢谢
答案 0 :(得分:4)
规则说如果你使用它,你需要syncDataCB
的定义。 “如果你使用它”的定义不同于正式,但这足以让人理解。
但是,如果在没有定义的情况下使用它,则编译器/链接器不需要来提供错误。在实践中,这意味着如果您将sync_data_cb_
传递给start
,但不使用syncDataCB
,那么如果start
被内联,您将不会收到错误,但是如果没有的话。
您不会总是收到错误消息这一事实并不重要,但这并不意味着代码有时是正确的。如果您使用sync_data_cb_
,则需要定义。
答案 1 :(得分:0)
与许多其他内容一样,只需要定义实际使用的符号( odr-used 在C ++ 11中使用)。
您可以声明更多您需要的东西,只要它们不被使用,您就不需要定义。