5

假设我有一堂课:

class Aggregate {

public:

    int x;
    int y;

};

我知道如何使用花括号初始化对象:

Aggregate a1 = { 1500, 2900 };

但是我找不到合适的语法来创建临时对象并将其作为参数传递给某个方法,例如:

void frobnicate(const Aggregate& arg) { 
    // do something
}

//...

frobnicate(Aggregate {1500, 2900}); // what should this line look like?

最简单的方法是将构造函数添加到 Aggregate 类,但假设我无权访问 Aggregate 标头。另一个想法是编写某种工厂方法,即

Aggregate makeAggregate(int x, int y).

我还可以创建一个对象,然后将其作为参数传递等等。

有很多解决方案,但我只是好奇是否可以使用花括号初始化来实现这个目标。

4

3 回答 3

8

C++0x 初始值设定项列表可以实现您想要的。

class Aggregate {
public:
    int x, y;
};

void frobnicate(const Aggregate& arg) {

}

int main() {
    frobnicate({1, 2});
    return 0;
}

-std=c++0xGCC 4.4 已经通过标志支持这一点。可能 VS2010 CTP 也支持这个(如果我错了,请纠正我)。

使用 C++98/C++03,您将不得不编写和调用构造函数。

于 2009-10-06T12:45:07.303 回答
3

现在不可能。因此,新标准 C++ 0x 引入了Initializer 列表Uniform_initialization的概念。

于 2009-10-06T12:46:39.033 回答
1

“有很多解决方案,但我只是好奇是否可以使用花括号初始化来实现这个目标。”

不可能。如果您无法更改源代码,那么您唯一的选择是将其包装在内联函数或辅助结构中:

struct AggregateHelper
{
    Aggregate a;
    AggregateHelper(int x, int y) { a.x=x; a.y=y; }
    operator const Aggregate& () { return a; }
};

frobnicate(AggregateHelper(1500,2900));

编辑:删除不相关的构造函数解决方案。

于 2009-10-06T12:39:02.747 回答