2016-11-19 8 views
0

クラスDynamicArrayListのクラスを使用してクラスヒープを実装しようとしています。私のヘッダーファイルには、ヒープには私のDynamicArrayListヘッダーが含まれており、プライベートメンバーとしてDynamicArrayListを持っています。私はまた私のDynamicArrayListの民間メンバーである配列「データ」を使用したい私のヒープを実装するには、しかし、それはすることを私にエラーを与える:データはプライベートメンバにアクセスすることはできませんプライベートメンバーのプライベートメンバーへのアクセス

DynamicArrayList :: クラスDynamicArrayListで宣言されました

ヒープファイルの配列を変更しようとします。たとえば、私はlstDynamicArrayListは、ヒープファイル内のプライベートメンバーとして定義されていると、私はエラーになるだろうと

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

をしようとするだろう。メンバーをprivateからprotectedに変更するか、アレイにアクセスするために他に何ができますか?

+0

'public'として設定しない限り、この場合は使用できません。 – skypjack

+1

'DynamicArrayList'は基本クラスではなくメンバであるため、' data'が 'private'か' protected'かどうかは関係ありません。 'DynamicArrayList'に' data'(誰でもアクセス可能)のアクセサー(ゲッター)を与えたり、 'DynamicArrayList'を' Heap'をフレンドとして宣言して(クラスを結合し、 'Heap'が効果的に扱えるようにします'DynamicArrayList'のメンバの全てを' public'として、実際に公開アクセスを提供することなく)。この場合、「カプセル化を破ることはありません」(https://isocpp.org/wiki/faq/friends#friends-and-encap)ので、「friend」がおそらくより良いでしょう。 –

答えて

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; 
}; 

希望します。