friend class
时间: 2023-10-31 07:56:55 浏览: 35
友元类是一种特殊的类关系,允许一个类的成员函数或其他类访问另一个类的非公有成员。在C++中,我们可以使用friend class关键字来声明一个类为另一个类的友元类。这样,在友元类中就可以直接访问原始类中的私有成员变量和函数。
需要注意的是,友元类和原始类之间存在相互依赖关系。如果在友元类中使用了原始类的私有变量,就需要在友元类定义的文件中包含原始类的头文件。而在原始类的定义中,不需要包含友元类的头文件,也不需要在类定义前声明友元类。因为友元类的声明本身就是一种声明,它指明可以在类外找到友元类。
另外,值得注意的是友元类关系是单向的,即使类B是类A的友元类,类A不一定是类B的友元类,这取决于是否在类中有相应的声明。而且友元关系也不会被继承,子类不会继承父类中的友元类关系。
相关问题
template<class T,int OTER_SIZE> friend class Stack<T, OTER_SIZE>;友元模板声明无效
如果在类中声明了友元模板类,那么它的模板参数列表需要与被声明类的模板参数列表完全一致,并且需要在类外部再次声明一遍。例如,如果我们在`Stack`类中声明了一个友元模板类`OtherStack`,那么我们需要这样写:
```
template<class T, int OTHER_SIZE>
class OtherStack;
template<class T, int SIZE>
class Stack {
public:
// ...
private:
// ...
template<class T, int OTHER_SIZE>
friend class OtherStack;
};
```
注意,这里的`OtherStack`类模板声明需要在类外部进行,而且模板参数列表需要与类内部声明的完全一致。
class User { friend class ComputerLab; friend main(); private: char name[7]; };
这个类定义中,`User` 类声明了 `ComputerLab` 类和 `main` 函数为友元。这意味着 `ComputerLab` 类和 `main` 函数可以访问 `User` 类的私有成员和保护成员。
但是,需要注意的是,将 `main` 函数声明为友元并不是一个好的实践。`main` 函数应该是程序的入口函数,而不应该直接访问其他类的私有成员和保护成员,这会破坏类的封装性原则,导致代码难以维护和扩展。
如果需要在 `main` 函数中访问 `User` 类的成员,可以通过公有成员函数或友元函数来实现。例如:
```cpp
class User {
public:
void setName(const char* newName);
// 友元函数声明
friend void printUserName(const User& user);
private:
char name[7];
};
// 公有成员函数定义
void User::setName(const char* newName) {
strcpy(name, newName);
}
// 友元函数定义
void printUserName(const User& user) {
cout << "User name: " << user.name << endl;
}
int main() {
User user;
user.setName("Alice");
// 在 main 函数中调用友元函数
printUserName(user);
return 0;
}
```