带初始值设定项的C ++匿名类

时间:2014-01-22 18:22:57

标签: c++ class object initialization

基于这个问题(前一段时间问过)

inline-object-instantiation-and-transformation-in-java

有没有办法在不使用构造函数的情况下在单行c ++中实例化和对象并初始化它的成员?

在java中,根据链接:

JFrame aFrame = new JFrame();
aFrame.add(new JPanel() {{
 setSize(100,100);
 setLocation(50,50);
 setBackground(Color.red);
}});

这可以用c ++中的任何方式完成吗?

编辑:例如

class Foo{
  public:
    int test;
    int test2;

};

int main(){
    Foo foo(){{test=5 test2=4}};  //Like this
}

3 个答案:

答案 0 :(得分:4)

如果类是聚合(没有基类,非公共成员,虚函数或用户声明的构造函数),那么您可以使用聚合初始化来初始化其成员:

struct thing {
    int a,b,c;
};

thing t = {1,2,3};

否则,它只能由构造函数初始化。

答案 1 :(得分:1)

这不是一个匿名的课程。匿名类是没有名称的类。

如果你想要一个匿名(临时)实例,你可以像这样初始化它:

struct Foo {
    int a;
    int b;
};

void bar(Foo const &);

int main() {
    bar(Foo{1,2});
}

请参阅Mike的答案,了解命名结构的命名实例的等价物。聚合约束是相同的。

答案 2 :(得分:1)

有一个习惯用法允许语法类似于Java。与所有事情一样,它也有其缺点。我会把它留给你来弄清楚它是否适合这个。

class Foo {
    int a;
    int b;
    int c;

public:
    Foo &setA(int val) {a = val; return *this;}
    Foo &setB(int val) {b = val; return *this;}
    Foo &setC(int val) {c = val; return *this;}
};

现在您可以执行以下操作:

auto foo = Foo().setB(2).setA(1).setC(3);

您可以根据需要将其应用于尽可能多的成员。但是,在某些情况下确保始终拥有有效对象可能会非常棘手。必需的初始化可以在构造函数中进行。

这些可能更自然的东西是Boost.Parameter,它提供了命名参数支持,可用于将有意义的名称与构造函数参数组合在一起。