【问题标题】:Friend methods in C++ is not workingC ++中的朋友方法不起作用
【发布时间】:2014-01-06 16:13:23
【问题描述】:

我写了以下代码:

class Osoba{
private:
    string imie, nazwisko, kolorOczu;
    friend void Dziecko::coutall();
public:
    Osoba(string imie, string nazwisko, string kolorOczu):imie(imie), nazwisko(nazwisko), kolorOczu(kolorOczu){};
    void coutall(){
        cout << "Imie: " << imie << endl; //
        cout << "Nazwisko: " << nazwisko << endl;
        cout << "Kolor oczu: " << kolorOczu << endl;
    }

};

class Dziecko: public Osoba{
private:
    string nazwaPrzedszkola, choroba;
    typedef Osoba super;
public:
    Dziecko(string imie, string nazwisko, string kolorOczu, string nazwaPrzedszkola, string choroba):super(imie, nazwisko, kolorOczu), nazwaPrzedszkola(nazwaPrzedszkola), choroba(choroba){};
    void coutall(){
        cout << super::imie; // this one gets underlined.
        cout << "Nazwa przedszkola: " << nazwaPrzedszkola << endl;
        cout << "Choroba: " << choroba << endl;
    }
};

这一行加下划线:

cout << super::imie; 

它说它无法访问。但在我看来,它是 - 我“加好友”了这种方法。 我尝试了 Dziecko 类的前向声明 - 也没有用。我做错了什么?

【问题讨论】:

    标签: c++ visual-studio-2010 class friend


    【解决方案1】:

    你不能这样做,因为在编译 Osoba 时没有定义 Dziecko::coutall 并且在 c++ 中没有办法进行前向成员方法声明。相反,您可以结交所有 Dziecko 类的朋友(如 Nbr44 建议的那样)

    【讨论】:

    • 这是正确的。但是如果使用继承,与整个班级交朋友看起来不是最佳实践......
    • 我同意。也许在 Osoba 中提供将 const ref 返回给 imie 的受保护方法是有意义的?
    【解决方案2】:

    您似乎无法调用该方法,因为它使用类 Osoba 的私有成员。

    尝试使用imie 作为受保护变量而不是私有变量。

    这是一个简短的explenation

    可用的 2 个选项是:

    1) friend 整个类,使用继承时不是一个好习惯。

    2) 使用受保护的成员。这是在继承时访问私有成员的最佳方式。

    【讨论】:

    • OP 期望 friend 声明来解决这个问题。那么问题来了,为什么不呢?
    • 页面声明Private members of the base class cannot be used by the derived class unless friend declarations within the base class explicitly grant access to them,这是OP似乎遇到的问题。
    • 所以你说我应该成为全班的朋友?所以不可能只给派生类的一个方法加好友?
    • @TomDavies92,以前的 cmets 是对的。我现在不在我的电脑上,所以我无法检查。我会尝试使用受保护的“imie”。目前。这行得通吗?
    • @TomDavies92 问题是您需要完整的派生类定义才能声明朋友成员函数。但是你不能拥有它,因为它需要完整的基本定义。如果没有继承,你可以让它工作。
    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 2011-12-11
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多