绝对怪异的编译器行为 - 构造函数没有被调用。

时间:2013-04-24 03:38:25

标签: c++ qt constructor declaration

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

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

第一个构造函数的实现是here(第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。

1 个答案:

答案 0 :(得分:5)

从技术上来说,积分应该转到Mark Bjogojapan来指出问题所在。编译器使用构造函数来查找违反单一定义规则的FileServerhere类。