C ++包含关系 - 总是需要初始化列表?

时间:2014-06-18 22:36:44

标签: c++ inheritance

如果我想要一个对象包含另一个(一个“has-a”关系)。始终必须在初始化列表中创建包含的对象吗?我想避免使用指针。如果我知道我必须使用初始化列表,那就没关系。

#include <iostream>

class A 
{
    private:
        int ii;
    public:
        A(int anIi): ii(anIi) {};
        int GetBilly() {return ii;}
        void billy() 
        { 
            for (int jj = 0; jj < ii; ++jj) 
            {
                std::cout << "Billy!" << std::endl;
            }
        }
}; 

class B {
    private:

    public:
        A mya;
        B(int wantIi): mya(A(wantIi)) {
        }
        void snoodly() {
            int ii = mya.GetBilly();
            for (int jj = 0; jj < 2*ii; ++jj)
            {
                std::cout << "Silly!" << std::endl;
            }

        }
};

int main () {
    B myB = B(5);
    myB.snoodly();
    myB.mya.snerdly();
    return 0;
}

2 个答案:

答案 0 :(得分:1)

如果类没有默认构造函数,则必须使用mem初始化程序列表初始化相应的对象。 或者您可以在类定义中初始化对象。

答案 1 :(得分:1)

不是。

可以通过默认初始化,类成员声明初始化或构造函数的初始化列表创建包含对象(CO)。如果CO没有默认构造函数或默认值不需要,则需要后两个。

如果在构造容器时CO的值已知且可用,则可以方便地将CO初始化为该值。

如果没有,完全合理地通过上述机制之一将CO初始化为某个无害的默认值,然后根据它支持的内容,通过赋值或方法调用设置其值。

所以我的答案是:不是真的,虽然它可能很方便。