Surcharge operator ostream

Hurobaki Messages postés 53 Date d'inscription   Statut Membre Dernière intervention   -  
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Dans le cadre d'un exercice en C++ je me retrouve a faire des surcharges d'operateur mais je suis face a un soucis. Je vous montre mes classes tout d'abord :

class Animal
{
	private:
		std::string _name;
		std::string _type;
		Owner _owner;

	public:
		Animal(const std::string& name, const std::string& type, const Owner *owner);
		~Animal();

		std::string getName();
		std::string getType();
		Owner getOwner();

		virtual void makeSound();
		virtual void move();

		//friend std::ostream& operator<<(std::ostream &os, const Animal& p);

};


#include "Animal.h"


Animal::Animal(const std::string& name, const std::string& type, const Owner *owner)
	:_name(name), _type(type), _owner(*owner)
{
}


Animal::~Animal()
{
}

void Animal::makeSound()
{
	std::cout << "Making an animal sound" << std::endl;
}

void Animal::move()
{
	std::cout << "Doing something to move" << std::endl;
}

std::string Animal::getName()
{
	return _name;
}

std::string Animal::getType()
{
	return _type;
}

Owner Animal::getOwner()
{
	return _owner;
}


/*std::ostream& operator<<(std::ostream &os, const Animal& p)
{
	return os << "test";
}*/


#include "Animal.h"

#include <string>

class Crow : public Animal
{
public:
	Crow(const std::string& name, const Owner *owner);
	~Crow();

	void makeSound();
	void move();

	friend std::ostream& operator<<(std::ostream &os, const Crow& p);
};


Crow::Crow(const std::string& name, const Owner *owner)
	:Animal(name,"Crow",owner)
{
	std::cout << *owner << std::endl;
	std::cout << owner << std::endl;
}


Crow::~Crow()
{
}

void Crow::makeSound()
{
	std::cout << "Crow is cawing" << std::endl;
}

void Crow::move()
{
	std::cout << "Crow is flying" << std::endl;
}


std::ostream& operator<<(std::ostream &os, const Crow& p)
{
	os << p.getName()<< " is a " << p.getType() << " his owner is " << p.getOwner() << std::endl;

	return os;
}


Donc voila j'ai une classe Animal qui est donc abstraite et je souhaite creer des animaux et donc redefinir l'operateur de sortie pour chaque animal mais des erreurs apparaissent dans le cpp de Crow, comme si je ne pouvais pas acceder aux methodes de ma classe mere. Pourtant Crow herite bien de Animal.

J'aimerai qu'on me dise ce que j'ai loupe et si vous avez des conseils a me donner.

Merci d'avance.

PS: Desole pour les accents, je suis sur un clavier qwerty donc pas d'accents...

1 réponse

Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101
 
Bonjour,
Le problème doit venir du fait que tes fonctions ne sont pas indiquée const, du coup l'operateur qui reçoit une const reference ne peut pas appeler les fonctions.

   std::string getName() const;
   std::string getType() const;
   Owner getOwner() const;
// et l'opérateur peut fonctionner sur n'importe quel animal, il n'a pas à être réécrit pour chacun
std::ostream& operator<<(std::ostream &os, const Animal& p)
{
	os << p.getName()<< " is a " << p.getType() << " his owner is " << p.getOwner() << std::endl;

	return os;
}
0