尝试与 Base 中的 Derived 函数成为朋友 - 为什么它不起作用?
Trying to befriend a function of Derived in Base - Why doesn't it work?
我的第一个 post 在这里。我有两个 classes - Base 和 Derived(从 Base 公开派生)。在 Derived 中,我有一个函数 printAsFriend。编译器对此不满意。为什么?其他 classes 中的方法可以成为朋友。为什么它不适用于派生的 class?如果我删除继承,它就可以正常工作。
这有效 -
#include <iostream>
using namespace std;
class MyClass;
class YourClass{
public:
YourClass(){}
void printAsFriend(MyClass m);
};
class MyClass{
private: int i;
public:
MyClass(){}
friend void YourClass::printAsFriend(MyClass m);
};
void YourClass::printAsFriend(MyClass m)
{ cout << m.i; }
int main(){
return 0;
}
但这并没有-
#include <iostream>
using namespace std;
class YourClass;
class MyClass{
private: int i;
public:
MyClass(){}
friend void YourClass::printAsFriend(MyClass m);
};
class YourClass:public MyClass{
public:
YourClass():MyClass(){}
void printAsFriend(MyClass m);
};
void YourClass::printAsFriend(MyClass m)
{ cout << m.i; }
int main(){
return 0;
}
我收到以下错误:
refFile.c:8:49: error: invalid use of incomplete type ‘class
YourClass’ friend void YourClass::printAsFriend(MyClass m);
^ refFile.c:3:8: error: forward declaration of ‘class YourClass’ class YourClass;
^ refFile.c: In member function ‘void YourClass::printAsFriend(MyClass)’: refFile.c:5:16: error: ‘int
MyClass::i’ is private private: int i;
^ refFile.c:16:14: error: within this context { cout << m.i; }
^
为什么这行不通?我错过了什么?是否不允许与派生的函数成为朋友class?
这与函数的好友关系无关,这是因为你不能引用你只转发声明的 class 的成员。
在你的第二个片段中,当时 MyClass
被定义 YourClass
只是前向声明 - 编译器还没有看到它的定义,所以不知道成员函数 printAsFriend
甚至存在。
我的第一个 post 在这里。我有两个 classes - Base 和 Derived(从 Base 公开派生)。在 Derived 中,我有一个函数 printAsFriend。编译器对此不满意。为什么?其他 classes 中的方法可以成为朋友。为什么它不适用于派生的 class?如果我删除继承,它就可以正常工作。
这有效 -
#include <iostream>
using namespace std;
class MyClass;
class YourClass{
public:
YourClass(){}
void printAsFriend(MyClass m);
};
class MyClass{
private: int i;
public:
MyClass(){}
friend void YourClass::printAsFriend(MyClass m);
};
void YourClass::printAsFriend(MyClass m)
{ cout << m.i; }
int main(){
return 0;
}
但这并没有-
#include <iostream>
using namespace std;
class YourClass;
class MyClass{
private: int i;
public:
MyClass(){}
friend void YourClass::printAsFriend(MyClass m);
};
class YourClass:public MyClass{
public:
YourClass():MyClass(){}
void printAsFriend(MyClass m);
};
void YourClass::printAsFriend(MyClass m)
{ cout << m.i; }
int main(){
return 0;
}
我收到以下错误:
refFile.c:8:49: error: invalid use of incomplete type ‘class YourClass’ friend void YourClass::printAsFriend(MyClass m); ^ refFile.c:3:8: error: forward declaration of ‘class YourClass’ class YourClass; ^ refFile.c: In member function ‘void YourClass::printAsFriend(MyClass)’: refFile.c:5:16: error: ‘int MyClass::i’ is private private: int i; ^ refFile.c:16:14: error: within this context { cout << m.i; } ^
为什么这行不通?我错过了什么?是否不允许与派生的函数成为朋友class?
这与函数的好友关系无关,这是因为你不能引用你只转发声明的 class 的成员。
在你的第二个片段中,当时 MyClass
被定义 YourClass
只是前向声明 - 编译器还没有看到它的定义,所以不知道成员函数 printAsFriend
甚至存在。