1

我有一个名为的类NitroShare::FileServer,它有两个构造函数:

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指出问题。编译器将构造函数用于此处FileServer发现的另一个类,违反了单一定义规则。

于 2013-04-24T04:53:34.447 回答