2015-07-18 102 views
0

有沒有辦法強制默認的初始化構造函數用於POD類型。這樣所有的值,如整數初始化爲零?在POD中強制默認的初始化構造函數?

struct MyPod 
{ 
    int a; // whether a is initialized to zero is dependent on creation method 
}; 

struct MyOtherNonPod 
{ 
    int b; 
    MyOtherNonPod() : b(0) // b initialized to zero regardless of creation method 
    {} 
}; 

MyPod* pod = new MyPod; // pod->a not initialized 
MyOhterNonPod* otherPod = new MyOtherNonPod; // otherPod->b is initialized to zero 

有沒有辦法做到這一點,而不必定義構造函數和手動in​​italize所有varaibles?但相反,只是強制默認的初始化構造函數總是被調用?

MyPod* pod = new MyPod{}; // pod->a is default initialized to zero 

有沒有辦法迫使上述構造函數來不管{}是否存在或不使用?我的POD類中有很多變量,名稱很詳細,我寧願消除類不會被初始化爲零的不確定性,這取決於我是否默認初始化。無需手動設置全部。

+0

'MyOtherPod'具有用戶指定的構造函數,因此不是POD對象。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf – kfsone

+0

另請參閱:http://ideone.com/zzgItk – kfsone

+1

一個選項是'struct MyPodV:MyPod { MyPodV():MyPod(){}};'。 'MyPodV'不是POD,但基類是,所以可能適合您的需求。 –

回答

1

不可能做你要求的,因爲POD可能沒有用戶聲明的構造函數。一種選擇是讓具有POD作爲基類的類:

struct MyPodV : MyPod 
{ 
    MyPodV: MyPod() {} 
}; 

然後您可以創建MyPodV對象,仍然與預期MyPod功能使用它們。

當然,有一個問題,你可能會忘記和MyPod,而不是MyPodV,所以這並沒有真正獲得太多的需要人做MyPod x{}。也許你可以使用一個命名約定來讓它更難以自己創建POD。

1

POD的定義是沒有用戶定義的構造函數可以存在,所有成員都必須是POD。因此,不,你不能。但看起來你不需要POD。

#include <iostream> 

struct NonPOD { 
    int i = {}; 
    double d = {}; 
    // NonPOD() = default; 
}; 

int main() { 
    NonPOD x; 
    std::cout << x.i << ", " << x.d << "\n"; 
} 
+0

根據[cppr](http://en.cppreference.com/w/cpp/language/aggregate_initialization),這不是一個聚合。 Nvm,它在C++ 14中,而不是在C++ 11中。 –

+0

有沒有辦法做到這一點,而不添加'= {}'? – user3901459

+0

該標準沒有說「用戶定義」,它表示「非平凡」。 'NonTrivial {NonTrivial(); }; struct Trivial {Trivial(){}};' – kfsone

0

是的,有一種方法可以在C++ 11中完成它。代碼如下:

#include <iostream> 

struct MyPod 
{ 
    int a; // whether a is initialized to zero is dependent on creation method 
}; 


int main() 
{ 
    MyPod* pod = new MyPod{ 23 }; // pod->a initalized to 23 

} 

在這種情況下,需要使用大括號,因爲這樣做是爲了順序地初始化每個成員。如果您在MyPod有更多的類型,那麼它可能是這樣的:

#include <iostream> 

struct MyPod 
{ 
    int a; 
    bool b; 
    double c; 
}; 


int main() 
{ 
    MyPod* pod = new MyPod{ 23, false, 32.93 }; 
} 
+1

我希望它被默認初始化,儘管(零),而不必依賴於它如何初始化。我希望它初始化爲零,而不必依賴於使用哪種方法進行初始化,而無需手動將每個變量設置爲零。 – user3901459

0

恐怕在C++中沒有默認的自動初始化至少不是你期待的方式。

據我確切知道你三個選項,因爲C++ 11標準至少選擇:

  1. 添加一個默認的構造函數,以每個結構,這可有點乏味。

    //Init by default constructor 
    struct POD3{ 
        int a; 
        int b; 
        char c; 
        POD3(): a{}, b{}, c{} {}; 
    }; 
    POD3 stackPod3; 
    POD3* heapPod3 = new POD3;   
    
  2. 爲結構中的每個成員添加一個默認初始化,這就是我要做的。

    //Init by field 
    struct POD{ 
        int a{}; 
        int b{}; 
        char c{};   
    }; 
    POD stackPod; 
    POD* heapPod = new POD; 
    
  3. 或者冒這個風險,並創建對象時,依賴於正確的語法,這是最糟糕的選擇。

    //Init by object creation 
    struct POD2{ 
        int a; 
        int b; 
        char c;   
    }; 
    POD2 stackPod2{}; 
    POD2* heapPod2 = new POD2{}; 
    

正如上面我個人的看法已經提到的是,第二個選項是最好的代碼的可讀性和缺少一個成員是相當低的機會。

+0

拳頭不是吊艙。 –

+0

@RussellGreene既不是第二個:http://coliru.stacked-crooked.com/a/74083e9916751883 – sehe

相關問題