2016-04-30 2 views
-1

Я пытаюсь реализовать классы, которые используют наследование/полиморфизм, и я не могу понять, почему я получаю эти недопустимые операнды к двоичной ошибке выражения («basic ostream char std 1 char charits char и void). Ошибка находится внутри функции, называемой анимация ниже, где она окружена двумя **, прямо над главной. 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]; 


} 

Я не должен для изменения основного или анимационного. Я должен правильно реализовать все классы

+0

В сообщении об ошибке говорится, что не так. Вы не можете '<<' поток с пустотой. –

+0

'move' должен возвращать строку; один глагол («пиломатериалы», «муха», «тромп»). Вы жестко закодировали строку, которую 'animate' должен построить в' move'. – molbdnilo

ответ

0

Возврат тип вашей функции void:

void Creature::move() 

Вы не можете отправить пустоту в поток, вам нужно что-то вернуть печати, строку, INT, BOOL, независимо от ...

0

Try это ....

#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]; 


} 
Смежные вопросы