2013-11-24 135 views
1

嗯,我認爲這可能是一個非常簡單的問題,但我仍然不知道我做錯了什麼。 這是我的問題:訪問對象C++

我有3個班,讓我們稱之爲A,B和C

class A 
{ 
    public: 
    B *b_object; 
    C *c_object; 
} 

a.cpp

A() 
{ 
    b_object = new B; 
    c_object = new C; 
} 

,所以我們實際上有兩個對象,當我們創建一個對象時,b和c之一。

b.h

#include "a.h" 

B類還包括A.H但我不能訪問c_object形成像

c_object->do_stuff(); 

這是爲什麼不工作b_object?我認爲用* c_object創建堆並通過b.h中的#include「a.h」我應該可以訪問它。

提前以及感謝, 薩米

+0

你在哪裏試圖訪問c_object?從B對象內部? – Tushar

+0

「從b_object訪問c_object」?不是'A'類的c_object部分? –

+1

是否有任何理由爲什麼你使用指針和動態內存分配,而不是將'b_object'和'c_object'作爲'A'的成員嵌入?另外,你在'A類'末尾丟失了一個分號,這是一個錯字,還是它實際上代表了你的代碼? –

回答

1

你應該明白encapsulation,這是C的一大特色++和一般的面嚮對象語言。由於你的c_object被定義爲裏面的這個A類,它只能被一個A對象訪問(除非你另有指定)。

您的b_object也在A類中,但這並不意味着它可以訪問c_object。例如,讓b_object成爲汽車的門,c_object成爲輪胎。汽車本身就是a_object。僅僅因爲一輛車同時擁有車門和一些輪胎並不意味着車門應該能夠讓輪胎做一些事情。只有汽車能夠同時進入。

+0

嗯,我想我發現我的具體問題,這與Qt中的信號和插槽有關。但我的問題仍然是一樣的。讓我們堅持你的汽車的例子。是否有可能讓車門進入輪胎並讓他們做點什麼? (聽起來很傻,但你明白了) –

+0

@SeriousSammy這是可能的,但它破壞了封裝的目的。封裝確保任何隨機類不能訪問/修改你的類的內容。如果你想讓門進入輪胎,也許你應該考慮一些其他的設計。也許汽車可以問門(在對象b上調用某個函數)是否應該對輪胎執行動作(如果函數返回true,則調用對象c上的另一個函數)。 – Tushar

+0

你是對的,讓門進入輪胎實際上是一個壞主意。但是,通過指針是可能的嗎? (好吧,我不會這樣做,我已經解決了我的問題) –

0

如果我沒有弄錯,你有循環依賴的問題: 1)B.h包含在A.h. 2)A.h包含在B.h.中。

因爲A需要知道B的成員來初始化它的B指針,而B需要知道A的成員去做你正在努力完成的任何事情。從而創建循環依賴。

http://en.wikipedia.org/wiki/Circular_dependency

而且,僅僅因爲你在B.h包括A.H並不意味着你有權訪問的數據成員。你必須有一個存在的對象A(在B之內),以便你訪問指針C.

或者你可以使它成爲B是派生類A,所以B將繼承私有數據成員A,然後允許你訪問指針C.

+0

沒有循環依賴不是問題。我想知道A是否有兩個對象b和c,b有可能訪問c?或者像上面說過的圖沙爾那樣,門是否可以進入輪胎? –

+0

@Serious Sammy - 你是否想說因爲A類包含一個對象B,那麼該對象B應該能夠訪問對象C?如果是這樣,答案是否定的。此外,門可以接觸到輪胎,但這違背了封裝的原則。 – AFM

+0

是的,這正是我的意思。謝謝你的回答 –