首页 > 解决方案 > 与朋友 c++ 打交道时,相同的代码,不同的结果

问题描述

在玩代码时,我发现了一个问题。当声明友元函数并将 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”未定义。我认为它们是相同的代码,但我不知道为什么一个有效而另一些无效。请帮忙。

标签: c++friend

解决方案


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


推荐阅读