2013-11-23 28 views
0

的私人承包商,客人我有一類結構類似這樣的訪問類

class B; 

class A { 
    private: 
     B *b; 
    public: 
     A(int val) { 
      b->SetVal(val); 
     } 
}; 

class B { 
    private: 
     int mynum; 
    public: 
     B(); 
     void SetVal(int value) { 
      mynum = value; 
     } 
}; 

而且主:

void main(){ 
    A Head(10); 
} 

這個程序編譯,但在運行時返回一個訪問衝突。據我所知中的mynumprivate,但即使我公開它不起作用。這是爲什麼?

回答

2

你應該初始化*b和刪除~A()

class A { 
    private: 
     B *b; 
    public: 
     A(int val) { 
      b=new B(); 
      b->SetVal(val); 
     } 
     ~A() 
    { 
     if(b) 
     { 
      delete b; 
      b=0; 
     } 
    } 
}; 
+0

我認爲b = new B();將需要完整的B類規範,這在頭文件中是不可用的,但是如果c-tor將被放入實現文件中則可用。 – marcinj

0

您實際上沒有在任何地方指向B指針。所以當你的構造函數試圖執行b->SetVal(val)時,你可能會遇到內存訪問衝突,並且絕對不會得到明確定義的行爲。

0

此無關的事實,mynum是私人的。您始終可以從該類的方法訪問類的私有成員。