您好想知道在C ++ 03中可以执行以下操作。我试过了,但对我不起作用。
struct SomeClass{
int a,b,c,d;
};
SomeClass * temp = new SomeClass();
*temp = { 1,2,3,4};
我做到了,但是编译器给了我一个警告,即只有C ++ 11支持扩展的initalizers 在使用new来创建对象时,还有其他方法可以使用双括号初始化吗? 不允许使用构造函数
答案 0 :(得分:4)
我认为你不能直接在C ++ 03中做到这一点,但是你可以(或许)简化这项工作,而不仅仅是暴力,你可能会认为它是“一流的构造函数”: / p>
struct someclass{
int a, b, c, d;
};
someclass make(int a, int b, int c, int d) {
someclass ret = {a, b, c, d};
return ret;
}
int main(){
someclass *s = new someclass();
*s = make(1, 2, 3, 4);
}
这是一个相当容易的赌注,任何合理的近期(可能甚至是最旧的)C ++编译器都会内联函数调用,因此函数调用不会产生任何开销。如果你愿意,你也可以把这个函数变成一个模板,并为不同数量的参数重载它,所以你可以这样做:
someclass *s = new someclass();
*s = make<someclass>(1, 2, 3, 4);
otherclass *o = new otherclass();
*o = make<otherclass>(1, 2);
然而,最终,这里的一个大问题是你开始走错了路。有可能(至少)在接下来的一两年内,你应该忘记C ++有new
个表达式。感觉就像你需要它(特别是在这样的情况下)是一个相当好的迹象,你还没有很好地适应C ++,并且仍在尝试编写Java。
答案 1 :(得分:1)
技术上当前C++
是C++11
。
无论如何,如果没有C++11
,你无法做到。您只能在创建结构或数组时进行初始化。
即
SomeClass temp = { 1,2,3,4 };
编辑:我需要看看它在C ++中的支持,但这似乎可以在C99中使用名为compound literals的东西
SomeClass temp;
temp = ((SomeClass){1,2,3,4});
Edit2 - 没有雪茄 - source.cpp:9:31: warning: ISO C++ forbids compound-literals [-pedantic]