2014-01-30 86 views
0

我有三個類。 A,B和C.抽象類指針

B類是一個抽象類。

A類需要調用B.類的功能

C類從類B來源,並且還需要持有一個指向A類調用類A的功能

要求1:

需要指向B的指針我知道這可以通過使用「B是一個抽象類,它不可能創建它的實例來實現,因此我在A中創建一個C實例並使用它來調用B的函數。「但是在創建C的實例時遇到問題。

要求2:

C類需要一個指向類A的指針來調用它的函數。我如何實現這一目標?

//A.h 

class A 
{ 
public: 
    void fun1(); 
    void fun2(); 
private: 
    // creating ptr to C because B is an abstract class 
    C *m_ptrC; 
}; 

//A.cpp 

void A::fun1() 
{ 
    m_ptrC->fun4(); 
} 
void A::fun2() 
{ 
    //some code 
} 



//B.h 
class B 
{ 
public: 
    //pure virtual function 
    void fun3() = 0; 
    void fun4(); 
}; 


//B.cpp 

void B::fun4() 
    { 
      //pure virtual hence C::fun3() gets called 
     fun3(); 
    } 



//C.h 
class C:public B 
{ 
public: 
    //Overridden from B 
    void fun3(); 

private: 
    //Ptr to class A, to call fun 
    A *ptrA; 
}; 

//C.cpp 
//Overridden from B 
void C::fun3() 
{ 
    ptrA->fun2(); 
} 

ptrC和ptrA應該如何初始化? 另外我不確定前向聲明和文件包含導致重定義/不完整類型錯誤。

+2

添加一些演示問題的代碼。 –

+0

您的聲明並不清楚您做了什麼或沒有什麼。你有一個從B派生出來的類來實現這些功能嗎? – crashmstr

+1

我認爲OP有循環依賴問題。前向聲明可能會有所幫助。 – Jarod42

回答

1

沒有實際的代碼,顯示問題,這裏就是我的想法發生了:

:您是包括C.h在A.H和C.h回曆中這被稱爲循環依賴。爲了避免這些,你需要使用前向聲明。你基本上聲明這個類,並且只在實際使用它的cpp文件中包含它的頭文件。所以在A.h例如你可以有:

class C; 

class A 
{ 

void fun1(); 

private: 

C *ptrC = new C; 
}; 

然後在A.cpp中你可以包含C.h.

其他問題可能會丟失,包括標題中的警衛。


:傳遞一個的實例(作爲ref或指針)至C的構造。此處也使用前向聲明。對物體的壽命保持謹慎。

像這樣的循環依賴關係往往比值得的更麻煩。嘗試爲A提供一個接口(所以你可以將它傳遞給C而不在C的翻譯單元中包含A.h)或者使用綁定到A實例的函數。


:我真的不知道爲什麼你,如果你不使用多態性有到C的接口,但它可能是由於缺乏真正的代碼。