Je suppose que c'est une question très simple et, probablement, une qui a été répondue plusieurs fois. Cependant, je suis vraiment nul en C++ et j'ai cherché en vain une solution. J'apprécierais vraiment l'aide.C++ "Variable non déclarée dans cette portée" - encore
En gros:
#ifndef ANIMAL_H
#define ANIMAL_H
class Animal
{
public:
void execute();
void setName(char*);
Animal();
virtual ~Animal();
private:
void eat();
virtual void sleep() = 0;
protected:
char* name;
};
class Lion: public Animal
{
public:
Lion();
private:
virtual void sleep();
};
class Pig: public Animal
{
public:
Pig();
private:
virtual void sleep();
};
class Cow: public Animal
{
public:
Cow();
private:
virtual void sleep();
};
#endif
est le fichier d'en-tête, où:
#include <iostream>
#include "Animal.h"
using namespace std;
Animal::Animal()
{
name = new char[20];
}
Animal::~Animal()
{
delete [] name;
}
void setName(char* _name)
{
name = _name;
}
void Animal::eat()
{
cout << name << ": eats food" << endl;
}
void Animal::execute()
{
eat();
sleep();
}
Lion::Lion()
{
name = new char[20];
}
void Lion::sleep()
{
cout << "Lion: sleeps tonight" << endl;
}
Pig::Pig()
{
name = new char[20];
}
void Pig::sleep()
{
cout << "Pig: sleeps anytime, anywhere" << endl;
}
Cow::Cow()
{
name = new char[20];
}
void Cow::sleep()
{
cout << "Cow: sleeps when not eating" << endl;
}
est le fichier C. Comme vous pouvez le voir, des choses très simples, mais, j'obtiens l'erreur suivante: "nom" n'a pas été déclaré dans cette portée "chaque fois que j'essaie de compiler.
Il compile si je commente la méthode setName. Iv a essayé de mettre 'name' à la disposition du public et a toujours la même erreur. J'ai aussi essayé d'utiliser "this-> name = _name" dans setName(), ce qui se traduit par "utilisation invalide de 'this' dans une fonction non-membre".
Je ne sais pas quoi chercher d'autre. Merci d'avance.
Notez que ce programme perd de la mémoire partout: non seulement 'Animal' dit' name = new char [20] ', mais toutes ses classes dérivées le sont aussi, ce qui signifie que chaque fois que 'Animal' La classe est instanciée, vous perdez 20 octets. De plus, la méthode 'setName()' devrait prendre un 'const char *', et devrait * copier * sa valeur dans le buffer 'name'; dire 'name = _name' ne copie que le pointeur, pas le contenu. Et la suppression de ces contenus n'est pas définie et peut provoquer un plantage. Il vaut mieux utiliser 'std :: string'. –