1

NitroShare::FileServer私は2つのコンストラクターを持つという名前のクラスを持っています:

FileServer(QObject * parent = NULL);
FileServer(const Certificate & certificate, QObject * parent = NULL);

最初のコンストラクターの実装は次のとおりです(29 行目)。

FileServer::FileServer(QObject * parent)
    : QObject(parent), d(new FileServerPrivate(this))
{
    qDebug("Constructor invoked!");
}

このクラスは、次の名前の別のクラスのメンバーですNitroShareClient:

NitroShare::FileServer server;

したがって、NitroShareClientクラスのインスタンスが作成されるときに、上記の最初のコンストラクターが呼び出されると想定されます。しかし、そうではありません。その結果、プログラムがクラッシュします。

ここで、物事が苛立たしいものから本当に奇妙なものに変わります: 上記の最初の行のコンストラクター宣言を次のように置き換えると:

FileServer(QObject * parent = NULL) : d(NULL) { qDebug("Constructor invoked!"); }

...コンストラクタが実際に呼び出されます! 同じサイン。同じパラメータ。同じ体。唯一の違いは、関数定義の場所です。

ここで何が起こっているのか誰か説明できますか? それが役立つ場合、私は Linux で GCC 4.7 を使用しています。

4

1 に答える 1

5

技術的には、問題を指摘したMark Bjogojapanにクレジットを与える必要があります。コンパイラは、1 つの定義規則に違反して、ここでFileServer見つかった別のクラスのコンストラクタを使用していました。

于 2013-04-24T04:53:34.447 に答える