c++ - 与朋友 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”未定义。我认为它们是相同的代码,但我不知道为什么一个有效而另一些无效。请帮忙。
解决方案
在第一个代码中,函数“Clock HHMM()”不是类的成员,而是在类外声明的独立函数。所以,main 可以很容易地调用它。对于你在课堂上提到的函数的定义,你需要写“Clock Clock::HHMM()”。在第二种情况下,该函数是该类的私有成员,因此您不能调用它。编译器不能在类外调用私有函数,因此会给出“未定义”错误。注意:类的默认访问说明符是私有的。
推荐阅读
- reactjs - Axios EPERM:不允许操作,读取
- php - laravel 循环将活动类添加到循环的第一项
- android - 在 Xamarin Android 中播放铃声一分钟
- angular - 打字稿可观察订阅未定义
- kubernetes - 在 kubernetes 中,如何访问 configmap 里面的环境变量?
- visual-studio - 在 SQL Server Data Tools 项目中指定项目的包含顺序
- node.js - 已部署网站错误中的护照本地(-mongoose)
- java - Selenium:如何获取给定 xpath 的子跨度元素列表
- laravel - Laravel 不再打开主页
- ssas-tabular - SSAS Tabular 2017 - 处理最新分区成功但数据消失