[英]C++ anonymous class with an initializer
基於此問題(前不久提出)
有沒有一種方法可以在不使用構造函數的情況下,在一行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};
否則,只能由構造函數初始化。
那不是一個匿名類。 匿名類是沒有名稱的類。
如果您想要一個匿名(臨時) 實例 ,則可以這樣初始化它:
struct Foo {
int a;
int b;
};
void bar(Foo const &);
int main() {
bar(Foo{1,2});
}
有關命名結構的命名實例的等效信息,請參見Mike的答案。 聚合約束是相同的。
有一個習慣用法允許使用類似於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 ,它提供了命名參數支持,可用於將有意義的名稱與構造函數參數組合在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.