运算符<<无法访问类的私有int

时间:2014-02-01 01:41:23

标签: c++ class operator-keyword

当我尝试编译时,我得到了这个:

  

../ 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;
}

2 个答案:

答案 0 :(得分:2)

此:

ostream& operator<<(ostream& out, const ProjectIV::Monster& monster)

应该是:

ostream& ProjectIV::operator<<(ostream& out, const ProjectIV::Monster& monster)

Here您的无效示例,而here是有效的。


另外,根据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}}