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++:如何在结构中定义类实例。类具有参数化构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中动态实例化具有不同数量参数的java类?

C++:如何正确的定义一个接口类

C++ 中,类的实例化对象是指啥?如果确保它的实例化对象只得一个?

Java类基本结构的理解

C++只能实例化1个对象的类

类和对象