2015-07-18 110 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

相关问题