C++:如何在结构中定义类实例。类具有参数化构造函数[重复]
Posted
技术标签:
【中文标题】C++:如何在结构中定义类实例。类具有参数化构造函数[重复]【英文标题】:C++: how to define class instance in structure. Class has parametrized constructor [duplicate] 【发布时间】:2019-11-05 10:03:31 【问题描述】:我有 C1 课:
class C1 : public Print
public:
C1(int p1, int p2, int p3);
;
我需要在结构 S1 中定义这个类的一个实例:
struct S1
C1 c1;
;
但是编译器说:
注意:'S1::S1()' 被隐式删除,因为默认定义格式不正确:...
错误:没有匹配的函数调用 'C1::C1() ...
候选人:C1::C1(int, int, int) 注意:候选人需要 3 个参数,提供 0 个
candidate: constexpr C1::C1(const C1&) class C1 : public Print 候选人需要 1 个参数,提供 0 个
当我编译这段代码时:
Struct S1
C1 c1(1,1,1);
;
编译器说:
错误:数字常量 C1 c1(1,1,1) 之前的预期标识符;
错误:数字常量前应有 ',' 或 '...'
C1 类的构造函数我不需要调用,后面会调用。我不能只在 C1 代码中删除这个构造函数,因为它是一个库。
当我定义全局变量时没关系:
C1 c1(1,1,1);
【问题讨论】:
你可以写struct S1 C1 c1 = C1(1,1,1); ;
或struct S1 C1 c11,1,1; ;
。
【参考方案1】:
由于C1 c1(1, 1, 1)
变量和函数声明c1
返回C1
之间的歧义,编译器似乎会抱怨(一般来说,它无法说出你想要什么)。为避免这种情况,请使用大括号初始化 C1 c11, 1, 1
或 =
: C1 c1 = C1(1, 1, 1)
。
如果您不想将其初始化为 C1(1, 1, 1)
,您可以在 S1
构造函数中获取参数并将它们传递到 init-list 中:
struct S1
S1(int p1, int p2, int p3): c1(p1, p2, p3) ;
C1 c1;
;
【讨论】:
【参考方案2】:每当您创建一个 S1 对象时,C1 对象都是使用它仅非默认构造函数 (c'tor) 构造的。
为了使其工作,您应该执行以下操作之一:
-
为 C1 定义 default c'tor,或者
为 S1 定义一个 c'tor,并在 S1 c'tor's init list 中调用 C1 的 c'tor。
【讨论】:
【参考方案3】:C1 类的构造函数我不需要调用,后面会调用。我不能只在 C1 代码中删除这个构造函数,因为它是一个库。
没有有意义的默认构造函数可用的数据成员的延迟初始化最好使用std::optional
实现;
#include <optional>
struct S1
std::optional<C1> c1;
;
这允许您先构造S1
实例,然后再构造它们的c1
数据成员。
S1 s;
// ... do stuff with s ...
s.c1 = C1(1, 2, 3);
如果您不能使用 C++17,请考虑使用第三方 optional
实现。否则,请使用(智能)指针。
【讨论】:
以上是关于C++:如何在结构中定义类实例。类具有参数化构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章