默认nullptr指针类构造函数得到解析外部符号C++
我有下面的类(非真名):默认nullptr指针类构造函数得到解析外部符号C++
class CObject1 : public IObject1
{
public:
CObject1(IObject2 *pIObject2 = nullptr);
}
其中“I”版本的接口类。现在,当我创建CObject1的实例为:
CObject1 object1;
我得到一个未解决的外部符号,抱怨CObject1(无效)未找到。如果我尝试显式声明另一个构造函数为:
CObject1()
我那么显然得到了“指定多个默认构造函数”的警告,正如人们所期望的那样。
为什么程序找不到我的默认ctor?
在此先感谢。
编辑: 其他注意事项:
- 接口本身不具有构造函数明确定义。
- 所有这些都在相同的命名空间下。即接口定义,实现和实例化。
- 我在MS单元测试中看到了这个。我没有一个可以测试的“正常”项目。
您的课程不是生成默认构造函数(CObject1()
)。它产生的是一个构造函数,它需要一个参数,任何读取该定义的代码都会知道如果它遇到本来是默认ctor的参数 - 这是在调用站点完成的。
class C {
public:
C(int* p = nullptr);
};
C fn() {
C c{};
return c;
};
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);
我需要破译这个...但我只是在上面指出,在一个评论中,当我用相同的实例创建一个空的控制台应用程序...它编译得很好。所以你的结论听起来不错我只需要充分理解现在的原因:)谢谢。 – ThermoX
btw kfsone,我想到了创建2显式构造并忘记= nullptr版本。但是这对我来说有点令人不安,因为我在ctor中使用了其他一些默认值,这意味着我必须修改所有这些,以防万一。没有太大的交易,只是令人不安,因为我真的没有想到这种行为 - 全部。但我不是专家。 – ThermoX
好吧......现在不是凌晨1点...我明白你的答案。我假设这种行为并不是独特的。它让我担心有些情况下程序可能看不到具有默认值参数的函数,然后无法编译。 (也......不知道为什么有人对我的问题投了弃权票,而不是解释为什么。) – ThermoX
那么,其中*是你的构造函数的实现吗?另外,请注意,您的定义适用于需要参数的构造函数。调用者负责填充该参数。有没有可能你有代码的地方实际上预计会有一个默认的ctor? – kfsone
无法用clang再现http://coliru.stacked-crooked.com/a/8f593e56ee403f20,gcc http://coliru.stacked-crooked.com/a/866ce558d29ee66e或msvc http://rextester.com/ODLZ30170 – kfsone
该实现在其cpp文件中。真的没什么特别的。 – ThermoX