Surcharge operator ostream

Fermé
Hurobaki Messages postés 53 Date d'inscription dimanche 23 mars 2014 Statut Membre Dernière intervention 10 mars 2017 - 18 avril 2016 à 19:11
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 18 avril 2016 à 21:26
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 dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
18 avril 2016 à 21:26
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