出来ますか?
class sample {
private:
int x;
public:
friend void fun();
};
friend
引数なしの関数!
私の意見では不可能です
フレンド関数はクラスの「メンバー」ではないため、クラスオブジェクトで呼び出すことはできません
お気に入り:
sample s;
s.fun();
出来ますか?
class sample {
private:
int x;
public:
friend void fun();
};
friend
引数なしの関数!
私の意見では不可能です
フレンド関数はクラスの「メンバー」ではないため、クラスオブジェクトで呼び出すことはできません
お気に入り:
sample s;
s.fun();
はい、次のことができます。
void fun()
{
sample s;
s.x++; // OK, fun() is a friend of sample
}
また
sample globalSample; // yikes, a global variable
void fun()
{
int i = globalSample.x; // OK, fun() is a friend of sample
}
はい、ただし変数の場合は、それらをグローバルにする必要があります。あなたの場合のタイプのグローバルオブジェクトsample
。または、おそらくの定義で内部的に関数内にオブジェクトを作成します。fun()
sample globalObject;
void fun()
{
globalObject.x++; //this will work as fun() is friend function of sample.
}
フレンド メソッドは、プライベート/保護されたデータ メンバーへのアクセスが指定されたメソッドのみに制限されるため、便利な場合があります。このメソッドに引数または戻り値の型があるかどうかは問題ではありません。
template <class T>
class CLinkedListNode {
public:
CLinkedListNode(CLinkedList<T>* Parent) : _Parent(Parent) {
}
protected:
CLinkedListNode * _Next;
T _Data;
CLinkedList<T>* _Parent;
friend CLinkedListNode<T>* CLinkedList<T>::find(); // Only CLinkedList<T>::find() may access data members
friend void sort(); // All sort methods may access data members
};
find()
したがって、メソッドが CLinkedListNode のすべてのデータ メンバーにアクセスできるクラス CLinkedList があるとします。
template <class T>
class CLinkedList {
// ...
CLinkedListNode<T>* find() {
CLinkedListNode<T>* Node = new CLinkedListNode<T>(this);
CLinkedListNode<T>* Find = Node->_Next;
while (Find->_Next) {
// Do something
Find = Find->_Next;
}
// ...
return Node;
}
};
sample s;
s.fun();
C++ の「友情」は、プライベート/保護されたメンバーへのアクセス制限を解除しているだけなので、これはとにかく機能しません。フレンドはクラス メンバーではないため、s.fun() を呼び出すことはできません。
ただし、説明したようにフレンド関数を宣言できます。その関数から、サンプル クラスのプライベート メンバーにアクセスできます。