当我尝试编译时,我得到了这个:
../ Monster.h:26:9:错误:'int ProjectIV :: Monster :: con'是私有的
`int con;` ^
../ Monster.cpp:17:39:错误:在此背景下
cout << "Constitution: " << monster.con << endl;
^make: * [Monster.o]错误1
据我所知,使运营商&lt;&lt;朋友应该允许它访问int con。我没看到什么。
Monster.h:
#ifndef MONSTER_H_
#define MONSTER_H_
#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
#include <string>
using std::string;
namespace ProjectIV
{
class Monster
{
friend ostream &operator<< (ostream &out, const Monster &monster);
public:
Monster(int con);
private:
int con;
};
} /* namespace ProjectIV */
#endif /* MONSTER_H_ */
Monster.cpp:
#include "Monster.h"
ostream &operator<< (ostream &out, const ProjectIV::Monster &monster)
{
cout << "Constitution: " << monster.con << endl;
return out;
}
ProjectIV::Monster::Monster(int con): con(con)
{}
main.cpp中:
#include "Monster.h"
using namespace ProjectIV;
int main()
{
Monster Gojira(140);
cout << Gojira << endl;
return 0;
}
答案 0 :(得分:2)
此:
ostream& operator<<(ostream& out, const ProjectIV::Monster& monster)
应该是:
ostream& ProjectIV::operator<<(ostream& out, const ProjectIV::Monster& monster)
另外,根据AndreyT的注释,您应该在friend
声明之前添加一个函数声明:
namespace ProjectIV {
class Monster {
friend ostream& operator<<(ostream& out, const Monster& monster);
public:
Monster(int con);
private:
int con;
};
ostream& operator<<(ostream& out, const Monster& monster);
// ^^^ this
}
答案 1 :(得分:0)
您的代码存在两个问题。
首先,Monster
类中的朋友声明引用ProjectIV::operator <<
函数。 ProjectIV::operator <<
成为Monster
的朋友。Monster.cpp
。您在::operator <<
文件中定义的内容实际上是Monster
。这是一个完全不同的功能,不是ProjectIV
的朋友。这就是你得到错误的原因。
因此,您需要决定要成为朋友的函数 - 全局命名空间中的函数或operator <<
命名空间中的函数 - 并相应地执行操作。
如果您想让ProjectIV
成为operator <<
命名空间的成员,则会遇到第二个问题。朋友声明将引用到封闭命名空间的成员,但他们不会将相应的声明引入封闭的命名空间。您仍有责任在ProjectIV
namespace ProjectIV
{
class Monster
{
friend ostream &operator<< (ostream &out, const Monster &monster);
public:
Monster(int con);
private:
int con;
};
ostream &operator<< (ostream &out, const Monster &monster);
} /* namespace ProjectIV */
添加声明
ProjectIV
然后将其定义为ostream &ProjectIV::operator<< (ostream &out, const ProjectIV::Monster &monster)
{
cout << "Constitution: " << monster.con << endl;
return out;
}
{{1}}