C++:如何在结构中定义类实例.类具有参数化的构造函数

C++: how to define class instance in structure. Class has parametrized constructor

本文关键字:实例 构造函数 参数 定义 结构 C++      更新时间:2023-10-16

我有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&(类C1:public Print{candidate需要1个参数,提供0个

当我编译这个代码时:

Struct S1{
C1 c1(1,1,1);
};

编译器说:

错误:数字常数C1 C1(1,1,1(之前应为标识符;

错误:应为","或"…"在数值常数之前

我不需要调用C1类的构造函数,我稍后会调用它。我不能仅仅删除C1代码中的这个构造函数,因为它是一个库。

定义全局变量时没问题:C1 c1(1,1,1);

由于C1 c1(1, 1, 1)变量和返回C1的函数c1的声明之间存在歧义,编译器似乎会抱怨(通常,它无法判断您想要什么(。要避免这种情况,请使用大括号initC1 c1{1, 1, 1}=:C1 c1 = C1(1, 1, 1)

如果你不想将其初始化为C1(1, 1, 1),你可以在S1构造函数中获取参数,并将其传递到init列表中:

struct S1{
S1(int p1, int p2, int p3): c1(p1, p2, p3) {};
C1 c1;
};

无论何时创建S1对象,都会仅使用非默认构造函数(c'tor(来构造C1对象。

为了使其发挥作用,您应该执行以下操作之一:

  1. 为C1定义默认c'tor,OR
  2. 为S1定义一个c'tor,并在S1的init列表中调用C1的c'tor

我不需要调用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实现。否则,使用(智能(指针。