如果类具有带有虚拟方法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