2011-09-12 173 views
1

我有一個類:訪問私有成員

class A 
{ 
private: 
ComplexClass member1; 

public: 
getMember1(){return member1;}; 
}; 

,我有,爲了簡化代碼(更容易理解),需要檢索的member1與它合作的實現。這是要我的腦海裏的第一件事是:

ComplexClass *myComplexClass = &getMember1(); 

myComplexClass.getSomething(); 
myComplexClass.getSomethingElse(); 
etc. 

這顯然是不正確的,因爲我從獲取一個新的對象的指針,而不是從member1中(並得到一個編譯器警告)。

我的問題是:做這種事情的最佳設計是什麼?我該如何保持封裝,並利用指向它的指針訪問成員? (我只想從member1讀取,而不是寫在它上面)。

我應該做一個

ComplexClass *getPointerToMember1() 

A類裏面?

+0

'ComplexClass myComplexClass = a.getMember1(); myComplexClass.getSomething();'? –

+0

你可能不應該添加一個getter開始。爲什麼外部實體需要訪問成員1.這是唯一的實體嗎?如果是這樣,讓它成爲朋友。 –

回答

3

const引用將阻止它們進行編輯。在我看來,它使你的意圖比const指針更清晰。

class A 
{ 
private: 
ComplexClass member1; 

public: 
const ComplexClass &getMember1(){return member1;}; 
}; 
+1

請記住,這可能會使封裝更加棘手,因爲這意味着您需要引用一個ComplexClass對象。 (想象一下'A'的未來實現,它不會維護成員變量,但可以根據需要動態創建一個'ComplexClass'對象。) –

+0

好的。但我相信:ComplexClass myComplexClass = A.getMember1(); myComplexClass.someInteger = 10;是一個有效的實現。 –

+0

@Oli給出這個例子,我們已經創建了一個對象。這是措辭的方式,我認爲代碼已經耦合了一點太高。儘管如此,我可以看到這對於一個奇怪的單元測試很有用。 –

1

你返回由值的成員,這使得一個複製ComplexClass成員的。因此,當您調用後續方法時(以及編譯器告訴您的是什麼),您不是在處理實際成員。

我認爲更地道的C++方式,可以幫助保持封裝和降低耦合是創建一個算法員:

A::doStuff() 
{ 
    member1.getSomething(); 
    member1.getSomethignElse(); 
} 

此使用class A方式有人不護理的實現使用ComplexClass但他們只知道他們可以告訴A做一些工作,並且會以最好的方式完成。

編輯評論:在這種情況下,我會建議創建方法AComplexClass獲得值(再次隱藏您的實現)。如果這不合適,那麼你可以通過const引用返回實現:const ComplexClass& getMember1() const { return member1; }

+0

是的,這將是一個好方法,但它不是這種情況下的有效選擇。正如我寫的,我想訪問member1中的數據,而不是執行它的工作。 –