C++:如何在结构中定义类实例.类具有参数化的构造函数
C++: how to define class instance in structure. Class has parametrized constructor
我有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对象。
为了使其发挥作用,您应该执行以下操作之一:
- 为C1定义默认c'tor,OR
- 为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
实现。否则,使用(智能(指针。
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- C++初始化类实例时隐式调用类成员的构造函数
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++ 常量正确性/缺少支持常量和非常量实例的类的常量构造函数
- C++ - 使用另一个类的构造函数实例化一个对象
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- C++如何在类构造函数中实例化 std::array?
- 避免通过操作从私有构造函数间接实例化
- 类构造函数 - 没有构造函数的实例
- 没有构造函数模型的实例::模型匹配参数列表
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- C++:如何在结构中定义类实例.类具有参数化的构造函数
- 在保证复制的世界中构造函数实例化
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- C++构造函数的实例都与参数列表匹配
- 为什么GCC将对全局实例构造函数的调用放在不同的部分(取决于目标)
- 如果使单一实例构造函数受到保护,缺点是什么 - 继承 - C++11.