c++ - 使用没有默认构造函数的常量字段初始化结构数组

标签 c++ arrays struct constants

我想定义一个结构数组,但这不起作用,因为它有一个没有默认构造函数的常量字段。

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 TXSTringconst 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/

相关文章:

c - 具有动态矩阵的动态结构

c++ - 斐波那契数列 - 动态数组

c++ - 如何在不调用 "-m"选项的情况下自动执行 git commit,以处理内部引号?

c++ - std::iostream 读取或写入计数为零且缓冲区无效

javascript - 解构对象数组 (es6)

c++ - 有没有一种方法可以在不更改递归函数中的数组的情况下忽略数组中的元素?

pointers - Goland 调试器的问题

c++ - 临时变量的生命范围

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

c++ - 如何简单地分配不同结构的 vector ?