默认nullptr指针类构造函数得到解析外部符号C++

问题描述:

我有下面的类(非真名):默认nullptr指针类构造函数得到解析外部符号C++

class CObject1 : public IObject1 
{ 
public: 
    CObject1(IObject2 *pIObject2 = nullptr); 
} 

其中“I”版本的接口类。现在,当我创建CObject1的实例为:

CObject1 object1; 

我得到一个未解决的外部符号,抱怨CObject1(无效)未找到。如果我尝试显式声明另一个构造函数为:

CObject1() 

我那么显然得到了“指定多个默认构造函数”的警告,正如人们所期望的那样。

为什么程序找不到我的默认ctor?

在此先感谢。

编辑: 其他注意事项:

  • 接口本身不具有构造函数明确定义。
  • 所有这些都在相同的命名空间下。即接口定义,实现和实例化。
  • 我在MS单元测试中看到了这个。我没有一个可以测试的“正常”项目。
+0

那么,其中*是你的构造函数的实现吗?另外,请注意,您的定义适用于需要参数的构造函数。调用者负责填充该参数。有没有可能你有代码的地方实际上预计会有一个默认的ctor? – kfsone

+0

无法用clang再现http://coliru.stacked-crooked.com/a/8f593e56ee403f20,gcc http://coliru.stacked-crooked.com/a/866ce558d29ee66e或msvc http://rextester.com/ODLZ30170 – kfsone

+0

该实现在其cpp文件中。真的没什么特别的。 – ThermoX

您的课程不是生成默认构造函数(CObject1())。它产生的是一个构造函数,它需要一个参数,任何读取该定义的代码都会知道如果它遇到本来是默认ctor的参数 - 这是在调用站点完成的。

class C { 
public: 
    C(int* p = nullptr); 
}; 

C fn() { 
    C c{}; 
    return c; 
}; 

Generates

fn():         # @fn() 
     pushq %rax 
     leaq (%rsp), %rdi 
     xorl %esi, %esi ; <<- injects the nullptr 
     callq C::C(int*) ; <<- note which ctor is called 
     popq %rax 
     retq 

但是:单元测试框架可能不会看到该定义,并与你的对象有一个默认的构造函数的要求工作。在这种情况下,你应该考虑写作:

CObject1() : CObject1(nullptr) {} 
CObject1(IObject2 *pIObject2); 
+0

我需要破译这个...但我只是在上面指出,在一个评论中,当我用相同的实例创建一个空的控制台应用程序...它编译得很好。所以你的结论听起来不错我只需要充分理解现在的原因:)谢谢。 – ThermoX

+0

btw kfsone,我想到了创建2显式构造并忘记= nullptr版本。但是这对我来说有点令人不安,因为我在ctor中使用了其他一些默认值,这意味着我必须修改所有这些,以防万一。没有太大的交易,只是令人不安,因为我真的没有想到这种行为 - 全部。但我不是专家。 – ThermoX

+0

好吧......现在不是凌晨1点...我明白你的答案。我假设这种行为并不是独特的。它让我担心有些情况下程序可能看不到具有默认值参数的函数,然后无法编译。 (也......不知道为什么有人对我的问题投了弃权票,而不是解释为什么。) – ThermoX