2016-11-19 177 views
0

我正在嘗試使用我的類DynamicArrayList來實現類堆。在我的頭文件中,Heap包含我的DynamicArrayList標題,並將DynamicArrayList作爲私有成員。在實現我的堆我想用數組「數據」,這也是我的DynamicArrayList的私有成員,但它給我的錯誤是:訪問私有成員的私有成員

DynamicArrayList ::數據無法訪問 類DynamicArrayList聲明私有成員

當我嘗試更改堆文件中的數組。例如,我會嘗試

lst.data[0] = lst.data[heapSize] 

lst正在DynamicArrayList定義爲堆文件中的私有成員,我會得到錯誤。我是否應該將成員從private更改爲protected,還有什麼可以訪問陣列?

+0

除非您將它設置爲'public',否則在這種情況下您將無法使用它。 – skypjack

+1

既然'DynamicArrayList'是一個成員,而不是基類,'data'是'private'還是'protected'並不重要。你可以給'DynamicArrayList'作爲'data'的訪問者(getter)(它允許任何人訪問它),或者讓'DynamicArrayList'聲明'Heap'爲朋友(它將這些類連接在一起,並且讓Heap有效地處理所有'DynamicArrayList'的成員都是'public',而沒有實際提供公共訪問權限)。在這種情況下,'friend'可能會更好,因爲[它不會破壞封裝](https://isocpp.org/wiki/faq/friends#friends-and-encap)。 –

回答

0

您應該使DynamicArrayList成爲相同類型的其他對象的朋友。 這樣您就可以訪問類中定義的方法中的私人數據。 朋友應該輕鬆使用,因爲它打破封裝。

這裏是如何使用的朋友的鏈接:https://www.tutorialspoint.com/cplusplus/cpp_friend_functions.html

下面是使用模板的另一個例子,因爲我認爲你會使用它們 根據您所定義的類項目。 例如:

template<typename eltType> 
class Data { 
public: 
// add new content 
void add(const eltType& _data){ 
    myStuff.push_back(_data); 
} 

// append data 
void append(const Data<eltType>& _data){ 
    vector<eltType>::const_iterator it = _data.myStuff.begin(); 

    for (; it != _data.myStuff.end(); it++){ 
     this->myStuff.push_back(*it); 
    } 
} 

// print data 
void print(void){ 
    vector<eltType>::iterator it = this->myStuff.begin(); 

    for (;it != this->myStuff.end(); it++){ 
     printf((*it + "\n").c_str()); 
    } 
} 

// my friend 
friend Data<eltType>; 
private: 
vector<eltType> myStuff; 
}; 

希望這有助於!