C++ 正在寻找重新初始化结构的简单方法

C++ 正在寻找重新初始化结构的简单方法,c++,struct,initialization,C++,Struct,Initialization,我有一个名为CoolStruct的结构: struct CoolStruct { int id; uint32 type; uint32 subtype; String name; }; 我还有这些结构的向量: std::vector<CoolStruct> coolVector; 但这当然不行。。。不允许进行重新初始化。是否有任何其他解决方案使其尽可能可读?我能想到的唯一替代方法是手动设置结构的每个参数: t.id = whatever; t.

我有一个名为CoolStruct的结构:

struct CoolStruct

{
    int id;
    uint32 type;
    uint32 subtype;
    String name;
};
我还有这些结构的向量:

std::vector<CoolStruct> coolVector;
但这当然不行。。。不允许进行重新初始化。是否有任何其他解决方案使其尽可能可读?我能想到的唯一替代方法是手动设置结构的每个参数:

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

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")}
};
那么:

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")}
};

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

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")));

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

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")));

为什么不写一个合适的构造函数呢?@Konrad:如果你能让聚合初始化正常工作,那就完全没有理由了。使用C++0x,你就可以用一个新的重写结构了。聚合具有简单的赋值运算符,因此一旦允许您编写
t={a,b,c},这就很容易了
@TomalakGeret'kal我完全反对样板,但认为构造函数就是样板有点过分。事实上,我喜欢清晰;因此,我总是重写构造函数。我也讨厌C++为我创建一个默认构造函数。@ KONRAD:一个构造函数,除了用与你给出的相同的元素初始化成员之外,什么都不做,完全没有意义。也许您想定义几个构造函数,因为您显然非常喜欢写出成员列表!为什么不写一个合适的构造函数呢?@Konrad:如果你能让聚合初始化正常工作,那就完全没有理由了。使用C++0x,你就可以用一个新的重写结构了。聚合具有简单的赋值运算符,因此一旦允许您编写
t={a,b,c},这就很容易了
@TomalakGeret'kal我完全反对样板,但认为构造函数就是样板有点过分。事实上,我喜欢清晰;因此,我总是重写构造函数。我也讨厌C++为我创建一个默认构造函数。@ KONRAD:一个构造函数,除了用与你给出的相同的元素初始化成员之外,什么都不做,完全没有意义。也许您想定义几个构造函数,因为您显然非常喜欢写出成员列表!甚至
coolVector={{1,EQData::…},{2,EQData::…}我以前使用memset重新初始化过结构。是因为字符串对象,你不能吗?@0A0D:很可能。即使没有,这也是一个可怕的想法。80年代,我们将
memset
抛在脑后,现在我们使用适当的语言功能。我也不知道
memset
如何帮助解决这个问题。您当然不能“重新初始化”任何内容。@Tomalak:
memset(&struct,0,sizeof(struct))
将“重新初始化”结构为0。@TomalakGeret'kal让我们甚至
coolVector={{1,EQData::…},{2,EQData::…}我以前使用memset重新初始化过结构。是因为字符串对象,你不能吗?@0A0D:很可能。即使没有,这也是一个可怕的想法。80年代,我们将
memset
抛在脑后,现在我们使用适当的语言功能。我也不知道
memset
如何帮助解决这个问题。您当然不能“重新初始化”任何内容。@Tomalak:
memset(&struct,0,sizeof(struct))将“重新初始化”结构为0。@TomalakGeret'kal让我们