2014-05-04 25 views
2

內聯函數欲寫像這樣的代碼:一個A對象調用它的類B型構件b的成員函數DoSomething,並在類BDoSomeOtherThing成員函數,它調用ANotify成員函數。請參見下面的代碼:相互包容在C++

類A:B

class A 
{ 
    B b; 

public: 
    A() : b(*this) 
    { 
    } 

    void DoSomething() 
    { 
     b.DoSomething(); 
    } 

    void Notify() 
    { 
    } 
}; 

類:

class B 
{ 
    A &a; 

public: 
    B(A &a) : a(a) 
    { 
    } 

    void DoSomething() 
    { 
    } 

    void DoSomeOtherThing() 
    { 
     a.Notify(); 
    } 
}; 

的問題是我要保持內部函數,所以代碼應該是在頭文件中。我不能簡單地相互包容,因爲它們可能導致相互包容,我不知道在這種情況下是否可以使用前向聲明。我可以在源文件中編寫實現,但它們不會是內聯函數。那麼,我該如何讓代碼工作?

+1

看看:http://stackoverflow.com/questions/23440230/debugging-inheritance-class/23440630#23440630 –

回答

1

您可以將成員函數的定義移出類定義,並通過使用inline明確地爲它們的類外定義加上前綴(仍然保持它們內聯)(並因此保留在頭中)。你這樣做之後,你會發現,

  • B類定義可以很容易的A成員函數的定義之前移動,從解決這些成員訪問B的問題,
  • A的類定義只需要一個B的前向聲明,因此在定義A修復問題之前添加class B;

做這兩個更改足以解決您的問題。