构造函数链接和初始化语法

时间:2014-01-24 19:12:27

标签: c++ oop constructor

想象一下,我有两个类,其中一个依赖于另一个:

class A
{
public: 
    A(bool flag)
    {
    }
};

class B
{
public: 
    B(A a) :
        mA(a)
    {
    }
    A mA;
};

现在假设我还有另外两个类:一个使用Foo和Bar的基类,以及一个派生自该类的类:

class Base
{
public: 
    Base(A a, B b) :
        mA(a),
        mB(b)
    {
    }

    A mA;
    B mB;
};

class Derived : Base
{
    Derived() :
        Base(A(true), B(????))
    {
    }
};

我怎样才能在这里建造吧?

2 个答案:

答案 0 :(得分:1)

像这样:

class Derived
:
  public Base
{
public:
  Derived()
  :
    Base (true, Foo (false))
{
};

此处不使用new。托托,我们不再是C#了。 new用于对象的动态实例化,并返回指针。你不是在这里动态分配任何东西,而是你不存储指针。您不使用new

答案 1 :(得分:0)

  

想象一下,我有两个课程,其中一个是依赖另一个...         Derived() : Base(A(true), B( ???? ))

要为中的类设计依赖关系或关系,您需要使用引用(只要您不引用类A的简单等效副本实例):

class A
{
public: 
    A(bool flag) { }
};

class B
{
public: 
    B(A& a) : mA(a) { }
    A& mA;
};

让课程Base执行:

class Base
{
public:
    Base(bool flag) : mA(flag), mB(mA) { }

private:
    A mA;
    B mB;
};

要允许默认构造和以后的赋值,请使用指针(Derived可以在构造函数体中设置mB.mA):

class B
{
public: 
    B() 
    : mA(nullptr) { }
    B(A* a) : mA(a) { }

    A* mA;
};

对于后一种选择,更不用说c++11 or other smart pointer实施的所有变体(请参阅std::unique_ptrstd::shared_ptrstd::weak_ptr)!