class ctor 中的默认 nullptr 指针给出未解析的外部符号 c++
Default nullptr pointer in class ctor give unresolved external symbol c++
我有以下class(非真名):
class CObject1 : public IObject1
{
public:
CObject1(IObject2 *pIObject2 = nullptr);
}
其中 "I" 版本用于接口 classes。现在,当我将 CObject1 的实例创建为:
CObject1 object1;
我得到一个未解析的外部符号,抱怨找不到 CObject1(void)。如果我尝试将另一个 ctor 显式声明为:
CObject1()
然后我显然收到了 "multiple default constructors specified" 警告,正如人们所期望的那样。
为什么程序找不到我的默认构造函数?
提前致谢。
编辑:
补充说明:
- 接口本身没有明确定义的构造函数。
- 所有这些都在同一个命名空间下。 IE。接口定义、实现和实例化。
- 我在 MS 单元测试中看到了这一点。我没有可以测试的 "normal" 项目。
您的 class 不会 生成默认 (CObject1()
) 构造函数。它生成的是一个需要一个参数的构造函数,任何读取定义的代码都会知道在遇到默认构造函数时填充该参数——这是在调用站点完成的。
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);
我有以下class(非真名):
class CObject1 : public IObject1
{
public:
CObject1(IObject2 *pIObject2 = nullptr);
}
其中 "I" 版本用于接口 classes。现在,当我将 CObject1 的实例创建为:
CObject1 object1;
我得到一个未解析的外部符号,抱怨找不到 CObject1(void)。如果我尝试将另一个 ctor 显式声明为:
CObject1()
然后我显然收到了 "multiple default constructors specified" 警告,正如人们所期望的那样。
为什么程序找不到我的默认构造函数?
提前致谢。
编辑: 补充说明:
- 接口本身没有明确定义的构造函数。
- 所有这些都在同一个命名空间下。 IE。接口定义、实现和实例化。
- 我在 MS 单元测试中看到了这一点。我没有可以测试的 "normal" 项目。
您的 class 不会 生成默认 (CObject1()
) 构造函数。它生成的是一个需要一个参数的构造函数,任何读取定义的代码都会知道在遇到默认构造函数时填充该参数——这是在调用站点完成的。
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);