0

この良い投稿(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

// ここでは static sync_data_cb_ void Master::sendData(){ list data = sync_data_cb_.syncData(); で使用します。list::iterator it; for (it = data.begin(); it != data.end(); ++it) { sendto(instance_->data_sock_fd_, (*it).c_str(), (*it).length(), 0 ,(const struct sockaddr *) &instance_->target_host_data_, instance_->sockadd_length_);

    }
}

このクラスの場合:

class Logger {
public:
    static void Log(const char *format, ...);
private:
    static FILE* file_;
    static mutex mtx_;
};

別のクラスで static static FILE* を宣言した (そしてそれをクラスメソッドで使用した) 場合、未定義のエラーは発生しません。

すべての場合において、これらの静的メンバーで使用しています。

誰かルールをクリアしてくれませんか?

ありがとうございました

4

2 に答える 2

4

ルールには、syncDataCB使用する場合の定義が必要であると書かれています。「使えば」というのは形式的には別の定義ですが、理解するにはこれで十分です。

ただし、定義なしで使用する場合、コンパイラ/リンカーはエラーを出す必要はありません。実際には、に渡しsync_data_cb_てもそこでstart使用しない場合、インライン化されてもエラーは発生しませんが、インライン化されていない場合はsyncDataCBエラーになります。start

常にエラー メッセージが表示されるとは限らないという事実は関係ありません。コードが正しい場合があるという意味ではありません。を使用する場合sync_data_cb_は、定義が必要です。

于 2012-10-04T14:22:08.597 に答える
0

他の多くのものと同様に、実際に使用されるシンボル( C++11 用語ではodr-used ) のみを定義する必要があります。

必要なものをさらに多く宣言することができ、それらが使用されない限り、定義は必要ありません。

于 2012-10-04T14:19:32.170 に答える