8

出来ますか?

class sample {
        private:
           int x;
        public:
           friend void fun();
};

friend引数なしの関数!

私の意見では不可能です

フレンド関数はクラスの「メンバー」ではないため、クラスオブジェクトで呼び出すことはできません

お気に入り:

sample s;
s.fun();
4

9 に答える 9

16

はい、次のことができます。

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
}
于 2013-07-30T08:24:02.640 に答える
2

はい、ただし変数の場合は、それらをグローバルにする必要があります。あなたの場合のタイプのグローバルオブジェクトsample。または、おそらくの定義で内部的に関数内にオブジェクトを作成します。fun()

sample globalObject;

void fun()
{
 globalObject.x++;   //this will work as fun() is friend function of sample.
}
于 2013-07-30T08:24:24.663 に答える
0

フレンド メソッドは、プライベート/保護されたデータ メンバーへのアクセスが指定されたメソッドのみに制限されるため、便利な場合があります。このメソッドに引数または戻り値の型があるかどうかは問題ではありません。

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;
    }
};
于 2013-07-30T08:54:00.457 に答える
0
sample s;
s.fun();

C++ の「友情」は、プライベート/保護されたメンバーへのアクセス制限を解除しているだけなので、これはとにかく機能しません。フレンドはクラス メンバーではないため、s.fun() を呼び出すことはできません。

ただし、説明したようにフレンド関数を宣言できます。その関数から、サンプル クラスのプライベート メンバーにアクセスできます。

于 2013-07-30T08:34:50.413 に答える