如果类具有带有虚拟方法c++的基,则使用initializer_list初始化类实例



如果类具有带有虚拟方法c++的基,如何使用initializer_list初始化类实例?我想避免编写构造函数,并使用";懒惰;初始化类如CCD_ 1的方法。但我有

错误:没有用于调用"X::X(<大括号括起的初始值设定项列表>("的匹配函数

有没有任何方法可以在不显著更改类的情况下简单地初始化X实例?

struct Y
{
virtual ~Y() = 0;
};
struct X : public Y
{
string msg;
virtual ~X() = default;
};
int main()
{
X x{"Some string"};
return 0;
}

评论已经回答了这个问题。下面是摘要。

简短回答

不,没有办法,因为这将是一个聚合初始化(https://en.cppreference.com/w/cpp/language/aggregate_initialization)只有当类(结构(具有时才可能

  • 没有用户声明的构造函数
  • 没有用户提供的、继承的或显式构造函数
  • 没有用户声明或继承的构造函数
  • 没有私有或受保护的直接(自C++17以来(非静态数据成员
  • 没有基类
  • 没有虚拟基类
  • 没有虚拟成员功能
  • 没有默认的成员初始值设定项

备选方案1

如果只有属性string msg,则可以执行以下操作。

#include <iostream>
using std::string;
using std::cout;
struct Y
{
virtual ~Y() = default; // !!! not pure virtual !!!
};
struct X : public Y
{
string msg;
virtual ~X() = default;
};
int main( int /*argc*/, char */*argv*/[] )
{
X   x;
x.msg = "Some string";
cout << "int main( int /*argc*/, char */*argv*/[] ) - #1" << 'n';
return 0;
}

注意:在上面的代码中,析构函数已更改为virtual ~Y() = default;,否则编译器会抱怨从~X()调用的析构函数丢失。链接器错误,可能是:

Undefined symbols for architecture arm64:
"m1::Y::~Y()", referenced from:
m1::X::~X() in m1.o

注意:您可能没有确保构造后状态一致性的构造函数。

备选方案2

使属性列表成为元组。

#include <iostream>
using std::string;
using std::cout;
struct Y
{
virtual ~Y() = default;
};
typedef string TMessage;
typedef int TOtherAttribute;
using XAttributes = std::tuple<TMessage, TOtherAttribute>;
struct X : public Y
{
XAttributes mx;
X( XAttributes l ) : mx{ l } {
};
virtual ~X() = default;
template<typename T> void print() const {
cout << "member = " << get<T>( mx ) << 'n';
}
};
int main( int /*argc*/, char */*argv*/[] )
{
X   x{ XAttributes{ "Some string", 34 } };
x.print<TMessage>();
x.print<TOtherAttribute>();
return 0;
}

输出:

member = Some string
member = 34

相关内容

最新更新