我想定义一个结构数组,但这不起作用,因为它有一个没有默认构造函数的常量字段。
Struct 是 SDK 的一部分,如下所示:
struct SParametricParamDef
{
const TXString fUniversalName;
SResString fLocalizedName;
const TXString fDefaultImperial;
const TXString fDefaultMetric;
EFieldStyle fFieldStyle;
short fChoicesChcID;
};
TXString
没有默认构造函数。所以以下是失败的:
SParametricParamDef *arrParams = new SParametricParamDef[size]; // <= throws compile time exception
for (int i = 0; i < size; i++)
{
arrParams[i] = params[i].def; // <= also throws an exception, because operator = is not available
}
有什么办法可以解决吗?结果我需要一个 SParametricParamDef*
,因为这个数组在 SDK 中再次使用...
信息
在旧的 SDK 版本中,const TXSTring
是 const char*
并且当时我没有遇到问题......现在我需要调整我的代码以使用新结构...
最佳答案
您得到的错误主要不是关于operator =
,而是关于您默认构造了一个包含const
成员的对象这一事实。这将使它们变得不可变,并且在循环中尝试修改它们的任何尝试都必须失败。
幸运的是,您可以使用 emplace_back
在 vector 内部初始化 SParametricParamDef 对象,而不采用间接的默认构造和赋值:
std::vector<SParametricParamDef> arrParams;
for(std::size_t n = 0; n < size; ++n) {
arrParams.emplace_back(params[n].def);
}
这应该最大限度地减少复制量,并且无需修改 struct
定义。
关于c++ - 使用没有默认构造函数的常量字段初始化结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47217524/