用新括号初始化?

时间:2013-02-05 07:07:53

标签: c++

您好想知道在C ++ 03中可以执行以下操作。我试过了,但对我不起作用。

struct SomeClass{
int a,b,c,d;
};

SomeClass * temp  = new SomeClass();
*temp = { 1,2,3,4};

我做到了,但是编译器给了我一个警告,即只有C ++ 11支持扩展的initalizers 在使用new来创建对象时,还有其他方法可以使用双括号初始化吗? 不允许使用构造函数

2 个答案:

答案 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]

似乎像someone else also had the same issue