2014-01-24 76 views
2

想象一下,我有两个班,其中一个是取决于其他:构造链接和初始化语法

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(????)) 
    { 
    } 
}; 

我该如何在这里构建酒吧?

+0

也许我错了,但我不认为你的班级酒吧是有效的。也许你只是省略了一些东西,并假设我们知道? – crush

+4

你为什么认为你需要使用'new'? –

+2

请在发布之前编译。这段代码中有很多小错误,它会混淆你真正的问题。 –

回答

1

像这样:

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

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

+0

'new'不再用于问题中。 'Foo(false)'('B(false)')使用隐式的'A'构造函数来实例化一个**无关的**实例。 OP将**需要**使用指针或引用来关联** A和B类的实例。 –

+0

@πάνταῥεῖ:OP在问题中明确地实例化了“A”和“B”的实例。我不明白你为什么在这里建议使用引用? –

+0

_'我不明白你为什么在这里建议使用引用?'因为OP要求**相关的类:“其中一个依赖于其他类” –

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)这里的变种!