c ++为什么不总是需要定义静态成员?

时间:2012-10-04 14:11:42

标签: c++

我读了这个好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 *的类中(并在类方法中使用它)我没有得到未定义的错误。

我在所有情况下都在这些静态记忆中使用。

任何人都可以为我清除统治者吗?

谢谢

2 个答案:

答案 0 :(得分:4)

规则说如果你使用它,你需要syncDataCB的定义。 “如果你使用它”的定义不同于正式,但这足以让人理解。

但是,如果在没有定义的情况下使用它,则编译器/链接器不需要来提供错误。在实践中,这意味着如果您将sync_data_cb_传递给start,但不使用syncDataCB,那么如果start被内联,您将不会收到错误,但是如果没有的话。

您不会总是收到错误消息这一事实并不重要,但这并不意味着代码有时是正确的。如果您使用sync_data_cb_,则需要定义。

答案 1 :(得分:0)

与许多其他内容一样,只需要定义实际使用的符号 odr-used 在C ++ 11中使用)。

您可以声明更多您需要的东西,只要它们不被使用,您就不需要定义。