【问题标题】:Looking for an easy way to reinitialize a struct寻找一种重新初始化结构的简单方法
【发布时间】:2011-07-13 20:08:02
【问题描述】:

我有一个名为 CoolStruct 的结构:

struct CoolStruct

{
    int id;
    uint32 type;
    uint32 subtype;
    String name;
};

我也有这些结构的向量:

std::vector<CoolStruct> coolVector;

我想创建一堆具有预定义值的结构来 push_back 到这个coolVector。我想防止代码变得笨拙和丑陋。我真的很想保留这个符号:

CoolStruct t = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")};
coolVector.push_back(t);
CoolStruct t =  {2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")};
coolVector.push_back(t);

但这当然行不通...不允许重新初始化。是否有任何其他解决方案可以使其尽可能具有可读性?我能想到的唯一选择是手动设置结构的每个参数:

t.id = whatever; t.type = somethingelse; t.subtype = thisisalotofcode; t.name = justtosetupthisvector;
coolVector.push_back(t);

【问题讨论】:

  • 为什么不写一个合适的构造函数呢?
  • @Konrad:如果您可以使聚合初始化正常工作,那绝对是没有任何理由的大量样板。
  • 使用 C++0x,然后你可以用一个新的结构覆盖。聚合具有微不足道的赋值运算符,因此一旦您被允许编写 t = {a, b, c};,这将是一件轻而易举的事。
  • @TomalakGeret'kal 我完全反对样板,但认为构造函数是样板有点过分。 其实,我喜欢直白;因此,我总是 覆盖构造函数。我也讨厌 C++ 为我创建了一个默认构造函数。
  • @Konrad:构造函数只使用与参数相同的东西初始化成员,这是完全没有意义的。也许您想定义 几个 构造函数,因为您显然非常喜欢写出该成员列表!

标签: c++ struct initialization


【解决方案1】:

怎么样:

CoolStruct t1 = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")};
coolVector.push_back(t1);
CoolStruct t2 = {2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")};
coolVector.push_back(t2);

在 C++0x 中,我认为你应该能够做到:

CoolStruct t;
t = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")};
coolVector.push_back(t);
t = {2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")};
coolVector.push_back(t);

甚至:

coolVector.push_back({1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")});
coolVector.push_back({2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")});

事实上,如果你真的想获得创意(并且你没有任何想要保留的先前元素),你可以用这种语法替换整个向量:

coolVector = {
   {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")},
   {2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")}
};

【讨论】:

  • 甚至coolVector = { { 1, EQData::... }, { 2, EQData::... } };
  • 我之前使用 memset 重新初始化了结构。是不是因为String对象的原因,不能?
  • @0A0D:很有可能。即使没有,这也是一个可怕的想法。我们在 80 年代留下了 memset,现在我们使用适当的语言功能。我也不太明白memset 是如何帮助解决这个问题的。你当然不能“重新初始化”任何东西。
  • @Tomalak: memset(&amp;struct, 0, sizeof(struct)); 会将结构“重新初始化”为 0。
  • @TomalakGeret'kal 让我们continue this discussion in chat
【解决方案2】:

如果你添加一个简单的构造函数:

struct CoolStruct
{
    CoolStruct(int id, uint32 type, uint32 subtype, String name) : id(id), type(type), subtype(subtype), name(name) {}
    int id;
    uint32 type;
    uint32 subtype;
    String name;
};

然后你可以这样做:

CoolVector.push_back(CoolStruct(1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")));
CoolVector.push_back(CoolStruct(2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多