私の問題を説明する小さなグラフをペイントで描きました。
<img>
でも、投稿後にタグを使うと出てこないみたい?
グラフ:
問題は、db の宣言のスコープです。コード:
extern Database db;
本当に「dbはどこかでグローバルに宣言されていますが、ここではありません」という意味です。その後、コードは先に進まず、実際にはグローバルに宣言しますが、main() の外側では見えない main() 内でローカルに宣言します。リンケージの問題を解決するには、コードは次のようになります。
Database db;
int main ()
{
...
}
extern Database db;
void some_function ()
{
...
}
main() の外でデータベースをインスタンス化する必要があります。それ以外の場合は、グローバル変数をシャドウするローカル変数を宣言するだけです。
GameServer.cpp:
#include GameSocket.h
Database db(1, 2, 3);
int main() {
//whatever
}
extern はすべての CPP (および結果の OBJ) ファイルに適用されているため、実際に DB をインスタンス化するものはありません。
これを回避する 1 つの方法を次に示します。Database.h で、次のように変更extern Database db
します。
#ifdef INSTANTIATE_DB
Database db;
#else
extern Database db;
#endif
次に、CPP ファイルの 1 つ (データベースがある場合は Database.cpp が適しています) の#define INSTANTIATE_DB
前にを追加し#include "Database.h"
ます。