2

C++ のフレンド関数について質問があります。関数がクラスのフレンド関数として定義されている場合、プライベート、プロテクト、パブリックのいずれであっても、任意のメンバー変数または関数にアクセスできることを理解しています。最近、doxygen を使用してドキュメント参照を作成していますが、フレンド関数の別の利点を見つけました。フレンド関数は、HTML ページのメンバー関数の後にリストされるため、クラスとの関係を簡単に示すことができます。ただし、関数がフレンドとして定義されていない場合、グローバル関数と見なされ、doxygen ではクラスのドキュメントに記載されません。次に、特定のクラスと関係を持つすべてのグローバル関数をそのフレンド関数として作成する予定です。これは良い習慣なのかどうか疑問に思っていました。

次のコードは、1 つの関数をフレンド関数またはグローバル関数として選択できることを示しています。

#include <iostream>
#include <map>
#include <set>
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <numeric>
#include <string>
using namespace std;

class ABCD
{
public: 
    int a;
    int b;
    friend void friend_fun(const ABCD &obj);
};

void fun(const ABCD &obj)
{
    std::cout<<obj.a<<endl;
    std::cout<<obj.b<<endl;
};

void friend_fun(const ABCD &obj)
{
    std::cout<<obj.a<<endl;
    std::cout<<obj.b<<endl;
};


int main () 
{
     ABCD obj;
     obj.a = 20;
     obj.b = 30;
     fun(obj);
     friend_fun(obj);

    return 0;
}
4

5 に答える 5

6

Doxygen を使用すると、関数のグループやその他のグローバルなものを作成して参照できます。これは、Doxygen の動作の癖を悪用するためだけに、有用な言語レベルの保護を破るよりもはるかに理にかなっています。

于 2012-08-08T14:21:31.720 に答える
2

ドキュメンテーション ツールの欠点に合わせるためだけにコードを変更することはありません。だから、いいえ、私はそれを良い習慣とは考えていません。

于 2012-08-08T14:11:41.147 に答える
1

フレンド関数メカニズムを使用することは決して良い習慣ではないため、避けるようにしてください。クラスの定義の外部からは、そのプライベート データにアクセスできません。C++ では、カプセル化/モジュラー メカニズムを使用することをお勧めしますが、フレンド定義はこのメカニズムを弱めるだけです。

于 2012-08-08T14:18:17.843 に答える
0

私はここでマイクの見解に同意しますが、私が理解している友人機能に関してさらにいくつかの点に言及したいと思います. - フレンド機能は推移的ではありません。これにより、フレンド関数は、ローカルであると宣言されているクラスに対してローカルに保持されます。・フレンド機能は継承しません。このように、フレンド関数は、フレンドであると宣言したクラスに対してのみフレンドになります。特定の関数をすべてではなくフレンドとして宣言することは、クラス所有者の完全に意識的な決定です。- 一方、メンバ関数[ゲッターとセッター]の場合、それらはクラス継承チェーンで使用可能になります。- また、2 つの独立したクラスを使用する必要がある機能は、それらのクラスに変更を加えることなく、フレンド関数を使用して実現できます。

于 2016-04-25T17:21:10.097 に答える
0

答えの基本は、すべてのグローバル関数をフレンド関数として宣言することは絶対に良い習慣ではありません。Doxygen は、クラスと密接な関係を持つ関数を接続するためのキーワードも提供します: /relates

于 2012-08-08T14:55:09.067 に答える