在C ++代码中初始化C结构

有没有更好的方法来初始化C ++代码中的C结构?

我可以在变量声明点使用初始化列表; 但是,如果在编译时不知道所有参数,或者如果我没有声明本地/全局实例,那么这没有用,例如:

遗留C代码,它声明了结构,并且还使用了API

typedef struct { int x, y, z; } MyStruct; 

使用C库的C ++代码

 void doSomething(std::vector &items) { items.push_back(MyStruct(5,rand()%100,items.size()));//doesn't work because there is no such constructor items.push_back({5,rand()%100,items.size()});//not allowed either //works, but much more to write... MyStruct v; vx = 5; vy = rand()%100; vz = items.size(); items.push_back(v); } 

创建本地实例,然后一次设置一个成员( myStruct.x = 5;等)是一个真正的痛苦,当尝试将20个不同的项添加到容器时有点难以阅读…

如果你不能添加一个构造函数(这是C ++ 03中的最佳解决方案,但你可能与C有兼容性约束),你可以编写一个具有相同效果的函数:

 MyStruct makeAMyStruct(int x, int y, int z) { MyStruct result = { x, y, z }; return result; } items.push_back(makeAMyStruct(5,rand()%100,items.size())); 

编辑:我现在已经检查过C ++ 0X为这个精确的问题提供了一些东西:

 items.push_back(MyStruct{5,rand()%100,items.size()}); 

这是g ++ 4.4中提供的。

你正在寻找C99复合文字。 示例代码:

 struct foo *foo = malloc(sizeof *foo); *foo = (struct foo){ bar, baz }; 

怎么样:

 MyStruct v = {5, rand()%100, items.size()}; items.push_back(v); 

不清楚你在问什么。 在C ++中,显而易见的解决方案是为结构提供构造函数:

 struct MyStruct { int x, y, z; MyStruct( int ax, int ay, int az ) : x( ax ), y( ay ), z( az ) {} }; 

创建一个函数来初始化它,类似于C ++构造函数的作用。

另一种选择是从struct派生并在那里添加构造函数。

 struct MyDerivedStruct : public MyStruct { MyDerivedStruct(int xi, int yi, int zi) { x = xi; y = yi; z = zi; } } 

然后,您可以在自己的代码中使用此派生类型,并在必要时将其传递给C库。 在适当的时候,语言应该隐式转换为MyStruct

作为奖励,您还可以添加其他有用的成员函数,甚至可能包含许多使用此类型的旧C函数。