【问题标题】:Friend Functions and Undefined Private Methods友元函数和未定义的私有方法
【发布时间】:2015-06-06 22:20:40
【问题描述】:

我一直在编写一个涉及运算符重载和友元函数的练习程序 (C++) - 其中一个友元函数 (ostream& operator)) 访问 (或者应该访问)类“理性”中的私有成员函数GCD()。定义 GCD() 函数结果没问题,但是给我一个问题的是前面提到的友元函数,因为当我提到 GCD() 时,我的 IDE 将其标记为错误,说私有函数身份不明。我会假设这是函数头等的放置问题,但这让我非常困惑。以下是我的代码的链接:

http://pastebin.com/NetfQHY1

非常欢迎任何帮助!非常感谢大家! :)

【问题讨论】:

  • 不要分享你的代码链接!尝试在此处粘贴最少的代码。
  • operator<< 不是成员函数——您需要在合适的对象上调用 GCD。但您可能希望在每次操作后进行简化,而不是在输出时。

标签: c++ function friend


【解决方案1】:

在您提供的代码中,您的问题似乎是您试图将 GCD 作为独立函数调用。但是,您将它定义为一个方法——一个旨在在对象上调用的函数。

所以为了调用GCD,你必须这样做:

rationalInstance.GCD();

由于您的 operator<< 实现是作为一个独立的函数,您不能这样做:

GCD();

...等同于:

this->GCD();

在独立函数的上下文中没有this 的概念。

鉴于您对operator<< 的定义,我认为这可能就是您想要的:

ostream& operator<<(ostream &out, const rational &robj)
{
    int divisor = robj.GCD();
}

但是,为了编译它,您可能必须更新 GCD 的定义/声明以表明它不会修改对象:

int rational::GCD() const;

...因为您的rational 参数被标记为const

【讨论】:

    【解决方案2】:

    听起来您需要forward declaration。确保在需要调用它的代码之前有一个私有函数的声明。因此,除了函数的实际定义之外,您还将有这个前向声明。

    您可能需要为此使用头文件——取决于调用者是否在不同的源文件中。如果是这样,您可以将前向声明放在头文件中,然后将该头文件包含在使用该函数的所有其他文件中。

    如需进一步阅读,请查看另一个 stackoverflow 帖子:C++ Forward Declaration

    【讨论】:

    • 不过,这两个函数都有前向声明(原型?)。但我会玩弄定位
    猜你喜欢
    • 2016-09-11
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多