基于这个问题(前一段时间问过)
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
}
答案 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,它提供了命名参数支持,可用于将有意义的名称与构造函数参数组合在一起。