带有初始化器的C 匿名类

C++ anonymous class with an initializer

本文关键字:初始化      更新时间:2023-10-16

基于此问题(不久前问)

内联 - 对象构成和转化在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
}

如果类是一个汇总(没有基类,非公开成员,虚拟函数或用户指定的结构器),则可以使用汇总初始化来初始化其成员:

struct thing {
    int a,b,c;
};
thing t = {1,2,3};

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

有一个成语允许语法类似于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。参数,该参数提供了名为参数支持,您可以将有意义的名称与构造函数参数相结合。

不是匿名类。一个匿名类是一个没有名字的班级。

如果您想要一个匿名(临时)实例,并且可以这样初始化:

struct Foo {
    int a;
    int b;
};
void bar(Foo const &);
int main() {
    bar(Foo{1,2});
}

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