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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-05 15:41:021020ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。