C++에서는 친구 기능과 액세스 제어가 충돌할 수 있습니다. 비공개 멤버에 액세스하려면 해당 멤버를 보호됨으로 선언하거나 프록시 기능을 사용할 수 있습니다. 예를 들어 Student 클래스에는 비공개 멤버 이름과 점수가 있고 친구 함수 printName 및 printScore는 이러한 멤버를 각각 인쇄할 수 있습니다.
C++ Friend 함수 및 액세스 제어 충돌
C++에서 friend 함수는 클래스의 비공개 멤버에 액세스할 수 있는 비멤버 함수입니다. 그러나 액세스 제어와 관련하여 친구 함수는 클래스 멤버 액세스 제어와 충돌이 발생할 수 있습니다.
액세스 제어
C++는 세 가지 액세스 제어 수준을 제공합니다.
친구 함수
친구 함수는 friend
키워드를 통해 선언됩니다. Friend 함수는 액세스 제어 수준에 관계없이 클래스의 모든 멤버에 액세스할 수 있습니다. 그러나 친구 기능은 클래스의 일부가 되지 않습니다. 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; } };
实战案例
在以下实际案例中,我们有一个 Student
类,它有 name
和 score
两个私有成员。我们想要创建两个友元函数 printName()
和 printScore()
액세스 제어 위반
친구 기능이 비공개 멤버에 액세스하려고 하면 액세스 제어 위반이 발생합니다. 예: 🎜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; } };🎜이 예에서
printX
함수는 클래스의 친구이지만 전용 멤버인 x
에 액세스하려고 합니다. 이로 인해 컴파일러 오류가 발생할 수 있습니다. 🎜🎜🎜충돌 해결🎜🎜🎜액세스 제어 충돌을 해결하려면 다음 방법을 사용할 수 있습니다. 🎜🎜🎜1 보호된 멤버를 사용하여 🎜🎜🎜 개인 멤버를 보호된 멤버로 선언합니다. 이를 통해 파생 클래스와 friend 함수가 멤버에 액세스할 수 있습니다. 🎜int main() { Student student; student.name = "John Doe"; student.score = 95; printName(student); printScore(student); return 0; }🎜🎜2. 프록시 함수 🎜🎜🎜를 사용하여 비공개 멤버에 대한 프록시로 다른 클래스 멤버 함수를 만듭니다. 이 프록시 함수는 친구 함수에서 사용할 수 있도록 공개적으로 액세스할 수 있습니다. 🎜
Name: John Doe Score: 95🎜🎜실제 사례🎜🎜🎜다음 실제 사례에는
name
및 score
라는 두 개의 private이 있는 Student
클래스가 있습니다. 회원. 우리는 이러한 비공개 멤버를 각각 인쇄하기 위해 두 개의 친구 함수 printName()
및 printScore()
를 만들고 싶습니다. 🎜rrreee🎜친구 기능을 사용하면 비공개 회원이더라도 학생의 이름과 성적을 쉽게 인쇄할 수 있습니다. 🎜rrreee🎜출력: 🎜rrreee위 내용은 C++ 친구 함수와 액세스 제어 간의 충돌의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!