【问题标题】:invalid operands to binary expression?二进制表达式的无效操作数?
【发布时间】:2016-04-30 23:45:01
【问题描述】:

我正在尝试实现使用继承/多态性的类,但我不知道为什么会出现此错误:

二进制表达式错误的无效操作数('basic_ostream' 和 'void')

错误出现在下面称为 animate 的函数中,它被两个 ** 包围,就在 main 的正上方。 c->move 出于某种原因给出了这个错误,但c->name 没有。我已经实现了其他一切,其他一切似乎都正常工作。这只是一个错误。有人可以解释发生了什么吗?基本上,这里的基类是生物,其他所有的类都是从它派生的。

#include <iostream>
#include <string>
using namespace std;


class Creature {
public:
    Creature(string new_name) {
        its_name=new_name;
    }
    virtual void move() const=0;
    virtual bool isMortal() const =0;
    string name() const {
        return its_name;
    }

    virtual ~Creature();
    
private:
    string its_name;
    
};

class Phoenix:public Creature {
public:
    Phoenix(string new_name):Creature(new_name) {};
    virtual void move() const{
        cout<<"Squawkes, who is immortal, will now fly.";
    }
    virtual bool isMortal() const {
        return false;
    }
    
    virtual ~Phoenix();
};

class Giant:public Creature {
public:  
    Giant(string new_name,int new_lbs): Creature(new_name) {
        lbs=new_lbs;
        
    }
    virtual void move() const {
        if (lbs<20) {
            cout<<"Frawp, who is mortal, will now tromp.";
        }
        else {
            cout<<"Gridwulfa, who is mortal, will now lumber.";
        }
    }
    virtual bool isMortal() const {
        return true;
    }
    
    virtual ~Giant();
private:
    int lbs;
};

class Centaur:public Creature {
public:
    Centaur(string new_name):Creature(new_name) {};
    virtual void move() const{
        cout<<"Squawkes, who is immortal, will now fly.";
    }
    virtual bool isMortal() const {
        return false;
    }
    
    virtual~Centaur();
};

void animate(const Creature* c)  //need to add & or is * sufficient?
{
    cout << c->name() << ", who is ";
    if (c->isMortal())
        cout << "mortal";
    else
        cout << "immortal";
    **cout << ", will now " << c->move() << ".\n";**
}

Here is my main:

int main() {
    
    Creature* creatures[4];
    creatures[0] = new Phoenix("Squawkes");
    // Giants have a name and a weight in tons.  Giants under 20 tons
    // walk by tromping; giants weighing at least 20 tons lumber.
    creatures[1] = new Giant("Frawp", 17);
    creatures[2] = new Giant("Gridwulfa", 22);
    creatures[3] = new Centaur("Florence");
    
    cout << "Here are the creatures." << endl;
    for (int k = 0; k < 4; k++)
        animate(creatures[k]);
    
    // Clean up the creatures before exiting
    cout << "Cleaning up." << endl;
    for (int k = 0; k < 4; k++)
        delete creatures[k];


}

我不应该更改主要或动画。我必须正确实现所有类

【问题讨论】:

  • 错误信息说明出了什么问题。你不能 &lt;&lt; 一个带有 void 的流。
  • move 应该返回一个字符串;单个动词(“lumber”、“fly”、“tromp”)。您已经硬编码了 animate 应该在 move 中构建的字符串。

标签: c++ inheritance binary expression operands


【解决方案1】:

你的函数的返回类型是void

void Creature::move()

您不能将 void 发送到流中,您需要返回可打印的内容、字符串、int、bool 等等...

【讨论】:

    【解决方案2】:

    试试这个....

    #include <iostream>
    #include <string>
    using namespace std;
    
    
    class Creature {
    public:
        Creature(string new_name) {
            its_name=new_name;
        }
        virtual std::string move() const=0;
        virtual bool isMortal() const =0;
        string name() const {
            return its_name;
        }
    
        virtual ~Creature();
    
    private:
        string its_name;
    
    };
    
    class Phoenix:public Creature {
    public:
        Phoenix(string new_name):Creature(new_name) {};
        virtual std::string move() const{
            return "fly";
        }
        virtual bool isMortal() const {
            return false;
        }
    
        virtual ~Phoenix();
    };
    
    class Giant:public Creature {
    public:  
        Giant(string new_name,int new_lbs): Creature(new_name) {
            lbs=new_lbs;
    
        }
        virtual std::string move() const {
            if (lbs<20)
                return  "tromp";
            return "lumber";
        }
        virtual bool isMortal() const {
            return true;
        }
    
        virtual ~Giant();
    private:
        int lbs;
    };
    
    class Centaur:public Creature {
    public:
        Centaur(string new_name):Creature(new_name) {};
        virtual std::string move() const{
            return "fly";
        }
        virtual bool isMortal() const {
            return false;
        }
    
        virtual~Centaur();
    };
    
    void animate(const Creature* c)  //need to add & or is * sufficient?
    {
        cout << c->name() << ", who is ";
        if (c->isMortal())
            cout << "mortal";
        else
            cout << "immortal";
        **cout << ", will now " << c->move() << ".\n";**
    }
    
    
    int main() {
    
        Creature* creatures[4];
        creatures[0] = new Phoenix("Squawkes");
        // Giants have a name and a weight in tons.  Giants under 20 tons
        // walk by tromping; giants weighing at least 20 tons lumber.
        creatures[1] = new Giant("Frawp", 17);
        creatures[2] = new Giant("Gridwulfa", 22);
        creatures[3] = new Centaur("Florence");
    
        cout << "Here are the creatures." << endl;
        for (int k = 0; k < 4; k++)
            animate(creatures[k]);
    
        // Clean up the creatures before exiting
        cout << "Cleaning up." << endl;
        for (int k = 0; k < 4; k++)
            delete creatures[k];
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多