【问题标题】:Same code, different result when dealing with friend c++ [duplicate]与朋友c ++打交道时相同的代码,不同的结果[重复]
【发布时间】:2021-09-12 17:55:41
【问题描述】:

在使用代码时,我发现了一个问题。 当声明友元函数并将 body 放在类之外时不会出错。

#include <iostream>
using namespace std;
class Clock
{
    friend ostream& operator<<(ostream& os, const Clock& c)
    {
        return os << c.hour << " hr. " << c.minute << " min. ";
    };
    friend Clock HHMM(int hhmm);

public:
    Clock() : hour(0), minute(0) { }

    static Clock minutes(int m)
    {
        return Clock(m / 60, m % 60);
    }
private:
    int hour, minute;
    Clock(int h, int m) : hour(h), minute(m) { }
};
Clock HHMM(int hhmm) {
    return Clock(hhmm / 100, hhmm % 100);
}

int main()
{
    Clock c1; // 0:00
    Clock c2 = HHMM(123); // 1:23
    Clock c3 = Clock::minutes(123); // 2:03
    cout << c1 << endl;
    cout << c2 << endl;
    cout << c3 << endl;
    return 0;
}

但是当将 body 放入类中时会出错。

#include <iostream>
using namespace std;
class Clock
{
    friend ostream& operator<<(ostream& os, const Clock& c)
    {
        return os << c.hour << " hr. " << c.minute << " min. ";
    };
    friend Clock HHMM(int hhmm) {
        return Clock(hhmm / 100, hhmm % 100);
    };

public:
    Clock() : hour(0), minute(0) { }

    static Clock minutes(int m)
    {
        return Clock(m / 60, m % 60);
    }
private:
    int hour, minute;
    Clock(int h, int m) : hour(h), minute(m) { }
};


int main()
{
    Clock c1; // 0:00
    Clock c2 = HHMM(123); // 1:23
    Clock c3 = Clock::minutes(123); // 2:03
    cout << c1 << endl;
    cout << c2 << endl;
    cout << c3 << endl;
    return 0;
}

错误:标识符“HHMM”未定义。 我认为它们是相同的代码,但我不知道为什么一个有效而另一些无效。 请帮忙。

【问题讨论】:

  • 在第二种情况下,HHMM 成为成员方法。在类内部,它需要被声明为静态的,并使用 Clock::HHMM 调用。但我认为你会从日常 C++ 用户那里得到更好的建议。

标签: c++ friend


【解决方案1】:

在第一个代码中,函数“Clock HHMM()”不是类的成员,而是在类外声明的独立函数。所以,main 可以很容易地调用它。对于你在课堂上提到的函数的定义,你需要写“Clock Clock::HHMM()”。 在第二种情况下,该函数是该类的私有成员,因此您不能调用它。编译器不能在类外调用私有函数,因此会给出“未定义”错误。 注意:类的默认访问说明符是私有的。

【讨论】:

  • 不正确,friend 函数不是成员函数。
  • 那怎么在类外写函数体没有错误呢?我认为它们是相同的。
  • 请重新检查编辑后的答案。
猜你喜欢
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多