簡體   English   中英

具有初始化程序的C ++匿名類

[英]C++ anonymous class with an initializer

基於此問題(前不久提出)

內聯對象實例化和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};

否則,只能由構造函數初始化。

那不是一個匿名類。 匿名類是沒有名稱的類。

如果您想要一個匿名(臨時) 實例 ,則可以這樣初始化它:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM