为什么"<<"运营商可以继承,但">>"运营商不能?

时间:2014-12-23 11:38:11

标签: c++ inheritance operator-overloading

如果这只是一个愚蠢的问题,请原谅我。我还是C ++新手,这是我的做法。我试图用继承自单元对象的Actor Object和Enemy Object创建一个简单的游戏。我把所有的统计数据和重载的运算符放在了Actor类的Actor和Enemy中。这是我的每个类文件的简化代码:

注意:如果此代码太长,请阅读Actor.cpp上的错误并跳过所有这些。我写了所有这些因为我不知道我的错误从哪里开始。

Unit.h

#ifndef UNIT_H_INCLUDED
#define UNIT_H_INCLUDED

#include <iostream>
#include <fstream>
#include <string>

class Unit{

        friend std::ostream& operator<<(std::ostream&, const Unit&);
        friend std::istream& operator>>(std::istream&, Unit&);

    public:
        Unit(std::string name = "");

        void setName(std::string);

        std::string getName();

        std::string getInfo();

        int attack(Unit&);

    protected:
        std::string name;
};

#endif

Unit.cpp

#include "Unit.h"

using namespace std;

Unit::Unit(string name){
    this->name = name;
}

void Unit::setName(string name){
    this->name = name;
}

string Unit::getName(){
    return name;
}

string Unit::getInfo(){
    string info;
    info = "Name\t: " + name;
    return info;
}

ostream& operator<<(ostream& output, const Unit& unit){

    output << unit.name << "\n";

    return output;
}
istream& operator>>(istream& input, Unit& unit){

    input >> unit.name;

    return input;
}

Actor.h

#ifndef ACTOR_H_INCLUDED
#define ACTOR_H_INCLUDED

#include "Unit.h"

class Actor: public Unit{
    public:
        void saveActor();
        void loadActor();
};

#endif

Actor.cpp

#include "Actor.h"

using namespace std;

void Actor::saveActor(){
    ofstream ofs("actor.txt");
    if(ofs.is_open()){
        ofs << this;    // This work well.
    }
    ofs.close();
}
void Actor::loadActor(){
    ifstream ifs("actor.txt");
    if(ifs.is_open()){
        ifs >> this;    // This is the error.
    }
    ifs.close();
}

这段代码是简化的,我的真实代码包括HP,MP,atk,def,mag,agi with sets和gets for each field,就像名字字段一样。这就是为什么我需要超载&#34;&lt;&lt;&#34;和&#34;&gt;&gt;&#34;运算符。

我的IDE(Visual Studio)说:

  

错误C2678:二进制&#39;&gt;&gt;&#39;:找不到带有&#39; std :: istream&#39;类型的左手操作数的运算符(或者没有可接受的转换)

我的问题是:

     
  1. 为什么Actor类可以继承重载的插入运算符但是不能继承重载的提取运算符?
  2.  
  3. 将这些标准库包含在我的头文件中是不是一个好主意,还是应该将它们包含在cpp文件中?
  4. 第一个问题是我的问题。第二个是我的好奇心,我所有经验丰富的程序员都可以给我一个建议。

    抱歉我的语言不好。英语不是我的主要语言。

1 个答案:

答案 0 :(得分:8)

您正在播放Actor*

ofs << this;
ifs >> this;

而非流式传输Actor

ofs << *this;
ifs >> *this;

ofs行有效,因为它会调用operator<<的重载来打印指针,而不是因为它在Unit上调用了您的重载。