C では、フレンド関数とアクセス制御が競合する可能性があります。プライベート メンバーにアクセスするには、メンバーを保護済みとして宣言するか、プロキシ関数を使用します。たとえば、Student クラスにはプライベート メンバーの名前とスコアがあり、フレンド関数 printName と printScore はこれらのメンバーをそれぞれ出力できます。
C フレンド関数とアクセス制御の間の競合
C では、フレンド関数はクラスの非メンバーのプライベート メンバーにアクセスできます。関数。ただし、アクセス制御に関しては、フレンド関数がクラス メンバーのアクセス制御と競合する可能性があります。
アクセス制御
C は 3 つのアクセス制御レベルを提供します。
フレンド関数
フレンド関数は、friend
キーワードを通じて宣言されます。フレンド関数は、アクセス制御レベルに関係なく、クラスのすべてのメンバーにアクセスできます。ただし、フレンド機能はクラスの一部にはなりません。
アクセス制御違反
アクセス制御違反は、フレンド関数がプライベート メンバーにアクセスしようとすると発生します。例:
class MyClass { private: int x; friend void printX(MyClass& obj) { std::cout << obj.x << std::endl; } };
この例では、printX
関数はクラスのフレンドですが、プライベート メンバー x
にアクセスしようとしています。これにより、コンパイラ エラーが発生する可能性があります。
競合の解決
アクセス制御の競合を解決するには、次の方法を使用できます。
1. 保護されたメンバーを使用します。
プライベート メンバーを保護されたメンバーとして宣言します。これにより、派生クラスとフレンド関数がメンバーにアクセスできるようになります。class MyClass { protected: int x; friend void printX(MyClass& obj) { std::cout << obj.x << std::endl; } };
2. プロキシ関数を使用する
プライベート メンバーのプロキシとして別のクラス メンバー関数を作成します。このプロキシ関数は、フレンド関数で使用するためにパブリックにアクセスできます。class MyClass { private: int x; public: int getX() const { return x; } friend void printX(MyClass& obj) { std::cout << obj.getX() << std::endl; } };
実践的なケース
次の実際のケースには、name と # を持つ
Student クラスがあります。 ##score
2 人のプライベート メンバー。これらのプライベート メンバーをそれぞれ出力するために、2 つのフレンド関数 printName()
と printScore()
を作成したいと考えています。 <pre class='brush:cpp;toolbar:false;'>class Student {
private:
std::string name;
int score;
friend void printName(Student& obj) {
std::cout << "Name: " << obj.name << std::endl;
}
friend void printScore(Student& obj) {
std::cout << "Score: " << obj.score << std::endl;
}
};</pre>
フレンド機能を使えば、非公開会員であっても簡単に生徒の名前や成績を印刷することができます。
int main() { Student student; student.name = "John Doe"; student.score = 95; printName(student); printScore(student); return 0; }
出力:
Name: John Doe Score: 95
以上がC++ フレンド関数とアクセス制御の間の競合の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。