【问题标题】:Trying to befriend a function of Derived in Base - Why doesn't it work?尝试与 Derived in Base 的功能交朋友 - 为什么它不起作用?
【发布时间】:2015-08-26 19:45:31
【问题描述】:

我在这里的第一篇文章。我有两个类 - Base 和 Derived(从 Base 公开派生)。在 Derived 中,我有一个函数 printAsFriend。编译器对此不满意。为什么?其他类中的方法可以成为朋友。为什么它不适用于派生类?如果我删除继承,它工作正常。

这行得通-

#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: 错误:无效使用不完整类型‘class YourClass 的朋友 void YourClass::printAsFriend(MyClass m); ^ refFile.c:3:8: 错误:“class YourClass”类 YourClass 的前向声明; ^ refFile.c:在成员函数'void YourClass::printAsFriend(MyClass)'中:refFile.c:5:16:错误:'int MyClass::i' 是私有的 private: int i; ^ refFile.c:16:14: 错误:在此上下文中 { cout

为什么这不起作用?我错过了什么?不能和你的派生类的函数交友吗?

【问题讨论】:

    标签: c++ inheritance friend forward-declaration friend-function


    【解决方案1】:

    这与函数的交友无关,这是因为你不能引用你只前向声明的类的成员。

    在您的第二个 sn-p 中,在定义 MyClass 时,YourClass 仅被前向声明 - 编译器尚未看到它的定义,因此不知道成员函数 @ 987654323@ 甚至存在。

    【讨论】:

    • 对。感谢您的解释。那么是否有解决方法(使用友元函数,而不是访问说明符)?真的,就像学术好奇心一样。
    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2019-08-17
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多