ホームページ > バックエンド開発 > C++ > クラス内で引数を定義せずにフレンド関数にアクセスするにはどうすればよいでしょうか?

クラス内で引数を定義せずにフレンド関数にアクセスするにはどうすればよいでしょうか?

Susan Sarandon
リリース: 2024-11-05 15:41:02
オリジナル
1011 人が閲覧しました

How do you access a friend function without arguments defined inside a class?

クラスで定義されたフレンド関数へのアクセス

C では、クラス内でフレンド関数を定義できます。フレンド関数は、クラスのプライベートおよび保護されたメンバーにアクセスできる外部関数です。通常、フレンド関数は、外部モジュールまたは関数がクラス メンバーと対話できるようにするために使用されます。

問題:

次のコードを考えてみましょう:

<code class="cpp">class A {
public:
    friend void fun(A a);  // Friend function that takes an argument of type A
    friend void fun2();  // Friend function without arguments
    friend void fun3();  // Friend function declaration
};

void fun(A a) { std::cout << "Im here" << std::endl; }
void fun3() { std::cout << "Im here3" << std::endl; }

int main() {
    fun(A()); // Works OK
    // fun2(); // Error: 'fun2' was not declared in this scope
    // A::fun2(); // Error: 'fun2' is not a member of 'A'
    fun3(); // Works OK
}</code>
ログイン後にコピー

質問:

フレンド関数 fun2() にはどのようにアクセスできますか?

答え:

フレンド関数 fun2() を使用するには、クラスの外で明示的に定義する必要があります。現在、fun2() の定義が欠落しているため、コンパイラはグローバル スコープでそれを見つけることができません。

問題を解決するには、fun2() をクラス外のグローバル関数として定義します。

<code class="cpp">void fun2() { std::cout << "Im here2" << std::endl; }</code>
ログイン後にコピー

この変更により、エラーが発生することなく fun2() にアクセスできるようになります。

<code class="cpp">fun2(); // Works OK</code>
ログイン後にコピー

さらに、フレンド関数を別個のエンティティとして定義する典型的なパターンに従うことをお勧めします。明確さと保守性のためにクラスの外にします:

<code class="cpp">class A {
    friend void fun(A a);
    friend void fun2();
    friend void fun3();
};

void fun(A a) { std::cout << "I'm here" << std::endl; }
void fun2() { std::cout << "I'm here2" << std::endl; }
void fun3(); // Leave it as a declaration

int main() {
    fun(A());
    fun2();
    fun3();
}</code>
ログイン後にコピー

以上がクラス内で引数を定義せずにフレンド関数にアクセスするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート