2014-03-13 58 views
0

我想爲項目使用OGDF C++庫並希望使用該庫的類的受保護成員函數。我無法直接訪問類或派生類之外的受保護成員,因此要使用Balloon Layout類的受保護方法,我創建了一個從BallonLayout繼承的類A。從A開始,超類的受保護功能在A類的公共功能abc()中調用;這樣我可以在班級以外使用abc(),並且可以使用班級BallonLayout的間接保護功能。在派生類中訪問受保護的成員函數 - 分段錯誤

下面是代碼,請告訴我它在哪裏存在問題。

#include <ogdf/basic/Graph.h> 
#include <ogdf/basic/graph_generators.h> 
#include <ogdf/misclayout/BalloonLayout.h> 

using namespace ogdf; 

class OGDF_EXPORT A : public BalloonLayout{ 
     public: 
      void abc(const Graph &G){ 
      selectRoot(G); //Calling super class protected method.    
      } 
}; 

int main() 
{ 
    int n = 5, m = 7; 
    Graph G; 
    ogdf::planarBiconnectedGraph(G, n, m); 

    A* a = new A; 
    a->abc(G); 
    cout << "Done!!"; 
return 0; 

} 

它編譯沒有任何錯誤,但在運行時它給出「分段錯誤(核心轉儲)」。當我們試圖訪問不在內存中的東西(對象/變量)時,會出現這個錯誤。但我不明白我做了什麼錯誤。

代替A* a = new A; a->abc(G);,我也嘗試了以下,但我得到了同樣的錯誤。

A* a; 
a->abc(G); 

A *a = new A; 
a->abc(G); 
delete a; 

A a; 
a.abc(G); 

敵人上面的嘗試中的每一個,得到了一個段故障。此方法在調用a.abc(G)後調用超類的方法時出現此錯誤。

+0

'A * A;'不指向任何東西,你應該改變那些'A * A =新的A;'或'A中; ';' – Raxvan

回答

3
A* a; 
a->abc(G); 

這會創建一個沒有初始化它的指針;然後嘗試解除引用該無效指針以調用函數。結果是分段錯誤或其他未定義的行爲。

幾乎可以確定你想要創建一個對象:

A a; 
a.abc(G); 
+0

我也試過,但得到相同的錯誤:( 也用刪除a;但不工作 – Shaifali

+0

@Shaifali:除非用'new'創建對象,否則不要使用delete。如果你已經做出了我建議的更改並且它仍然崩潰,那麼錯誤出現在你沒有發佈的代碼中。 –

+0

請查看編輯後的問題;我嘗試了所有的情況,但是它在運行時給出了所有情況下的分割錯誤。 – Shaifali

相關問題