2013-07-12 47 views
0

我有一個類,看起來像這樣(詳細信息刪除):如何將內部結構內引用類中的其他成員

class MyClass{ 
     int seq[8]; 
     ... 
    public: 
     ... 
     static struct{ 
      bool sorted(); 
      bool reverse_sorted(); 
      ... 
     }test; 
}; 

我所試圖做的是我的一些MyClass成員函數單獨成漂亮的小團體(結構)。問題是「test」結構中的函數需要訪問MyClass的成員。

當我使用上面的代碼時,我可以定義bool sorted(){..},但它不會使它成爲MyClass命名空間的一部分,就像我希望的那樣。

我的目的是能夠寫出這樣的事:

MyClass M; 

*do stuff with M* 

if(M.test.sorted()){ 
    *do something* 
} 
else if(M.test.reverse_sorted()){ 
    *do something else* 
} 

有沒有辦法像這樣的東西是可能的嗎? (如何)我可以允許內部結構訪問類的數據成員? & &我仍然可以使用「MyObject.test.function()」語法訪問函數嗎?

+0

多重繼承呢? – Antonio

+1

當一個函數應該使用某個對象時,必須將它傳遞給該函數... – PlasmaHH

回答

0

你可以聲明你的類的結構爲friend來實現你想要的,但是你必須提供你的類的引用。我想,說實話,考慮到不良風氣,但這個工程:

class M 
{ 
    public: 
     struct x 
     { bool sorted(M & m) const { return m.sorted; } } test; 

    private: 
     bool sorted; 
     friend class x; 
}; 
+0

「靜態」在我的邏輯中可能只是一個缺陷。我在想一個結構是一個對象,我只需要一個副本來操作MyClass對象。我可以看到我在那裏錯了。我認爲這隻會幫助我排除我的成員職能 - 我大約有40人。我可能不得不求助於像Kirill建議的那樣加上前綴。 –

+0

是的,這聽起來不錯 - 你會想要避免'朋友'聲明,因爲他們所做的是破壞適當的封裝,在這種情況下,它尖叫骯髒的解決方法 – user2573221

0

我會建議使用簡單的事情:

class MyClass 
{ 
     int seq[8]; 
     ... 
    public: 
     ... 

     bool group1_sorted(); 
     bool group1_reverse_sorted(); 

     int group2_something_else(); 
}; 

前綴會給你足夠的亮點,而所有的問題會奇蹟般地消失......你爲什麼需要這些結構?

+0

是啊,我一開始試過...我想我可能只是不得不訴諸於此。我的部分問題還在於其中一個組具有散列函數和一個整數散列表,所以我想靜態存儲一個用於MyClass的散列表和散列函數的副本。 –