属性类型未知的模板类中的默认构造函数



我需要一个没有参数的默认构造函数。如何初始化未知类型的属性a

template <typename Type>
class Foo
{
public:
    Foo() : a(), b(0) {}  <---- Here is the confusion
private:
    Type a;
    int b;
};

Edit:答案已经在下面的评论中给出了,但是还有一些我不明白的地方。如果我有:

typedef enum {AB, CD} EnumType
template <typename Type>
class Foo
{
public:
    Foo() {}  // <---- "Member 'b' was no initialized in this constructor"
private:
    Type a;
    EnumType b;
};

我的编译器给了我这个警告:Member 'b' was no initialized in this constructor

为什么它给我这个警告,b是一个枚举,而不是a ?

如何初始化未知类型的属性a

你的解决方案是正确的。c++ 11标准第8.5/11段:

初始化式为一组空括号的对象,即(),应进行值初始化。[…]

然后,第8.5/8段:

对T类型的对象进行值初始化意味着:

-如果T是一个(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或有用户提供或删除的默认构造函数,则对象默认初始化;

-如果T是一个(可能是cv限定的)非联合类类型,没有用户提供或删除的默认构造函数,则对象为零初始化,如果T有非平凡的默认构造函数,则为default-initialized;

—如果T是数组类型,则每个元素都进行值初始化;

-否则,对象为零初始化。

最后,

为什么它给我这个警告b是enum而不是a ?

这可能是因为您为Type指定了一个模板参数,该参数是可以默认构造的UDT(用户定义类型)。如果不是这种情况,那么我希望编译器也警告你a没有在构造函数中初始化。但是,请注意,编译器不需要来发出任何此类警告。

只要类型Type有默认构造函数,这是正确的。当你声明模板时,你假设了一些关于类型的事情,并不是每个类型都可以在特定模板的构造函数中传递。这里,对于标准类型和具有默认构造函数的类型,一切都很好。如果您使用自己的类型初始化类Foo,而该类型没有提供默认构造函数,则会出现错误。

回答你的第二个问题:

如果您在命名空间范围内定义了变量,那么它将被value初始化为0。

enum SomeEnum {  
    EValue1 = 1,  
    EValue2 = 4,  
};
SomeEnum e; // e is 0
int i;      // i is 0
int main()
{
    cout << e << " " << i; //prints 0 0 
}

不要惊讶e的值可能不同于SomeEnum的枚举值。每个枚举类型都有一个基础的整型(如intshortlong),该枚举类型对象的可能值的集合就是基础整型所具有的值的集合。枚举只是一种方便地命名一些值和创建新类型的方法,但是您不需要通过枚举成员值的集合来限制枚举的值。

对T类型的对象进行零初始化意味着:
—如果T是标量类型(3.9),则该对象的值设置为0(0)转换成T;

注意枚举是标量类型。

对类型T的对象进行值初始化意味着:
-如果T是类类型blah blah
-如果T是一个非并集类键入blah blah
-如果T是数组类型,那么blah blah -否则,对象为零初始化

typedef enum {a,b,c,d} EnumType;
template <typename Type>
class Foo
{
public:
    Foo() {}  // <---- "Member 'b' was no initialized in this constructor"
public:
    Type a;
    EnumType b;
};
/*
 * 
 */
int main(int argc, char** argv) {
    Foo<int> fo;
    std::cout<<std::endl<<"fo.a:"<<fo.a<<",fo.b:"<<fo.b<<std::endl;
    EnumType e=d;
    fo.b=d;
    std::cout<<std::endl<<"fo.a:"<<fo.a<<",fo.b:"<<fo.b<<std::endl;
    Foo<int>* go=new Foo<int>;
    std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;
    go->b=d;
    std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;

fo.a: -137090040, fo.b: 32767

fo.a: -137090040, fo.b: 3

->: -166889576, -> b: 32767

->: -166889576, -> b: 3

:

    Foo<int>* go=new Foo<int>();
    std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;
    go->b=d;
    std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;

->: 0, -> b: 0

->: 0, -> b: 3

相关内容

  • 没有找到相关文章

最新更新