2010-08-16 7 views
3

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.

+4

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'. –

Répondre

8
void setName(char* _name) 
{ 
name = _name; 
} 

devrait être

void Animal::setName(char* _name) 
{ 
    this->name = _name; 
} 

Vous devez avoir Animal:: si vous utilisez le paramètre this. Sans Animal:: il pense que vous créez simplement une nouvelle fonction globale appelée setName

+0

Juste essayé et compilé, fonctionne parfaitement. Merci beaucoup Bob, qui a vraiment aidé :) – Jubbsee

+3

En fait le 'this-> name' n'est pas nécessaire pour résoudre' name', une fois que 'setName' a été correctement transformé en une fonction membre non statique. –

+1

vous avez raison @Timo, je veux juste être très explicite quand j'écris mes classes C++. S'il vous plaît accepter si cela vous a aidé @Jubbsee –

1

L'indice était "fonction non-membre".

Vous devez faire la fonction dans une fonction membre:

void Animal::setName(char* _name) 
{ 
name = _name; 
} 
4

La façon dont vous avez écrit le code setName est une fonction libre, pas une fonction de membre. Pour cette raison, le compilateur ne peut pas résoudre name.

Vous devez changer setName à ceci:

void Animal::setName(char* _name) 
{ 
    name = _name; 
} 
1

« Il compile si je commente la méthode setName »

Vous ne disposez pas d'une « méthode setName » dans votre programme (se référant à la définition problématique). Vous avez défini une fonction globale complètement indépendante appelée setName, qui n'est pas une "méthode" de n'importe quoi. Si vous souhaitez définir une méthode , c'est-à-dire une fonction membre d'une classe, vous devez vous y référer en utilisant le format class_name::method_name. Ce serait Animal::setName dans votre cas.

+0

je vois. Grâce à toutes les notes et réponses, il a commencé à devenir plus clair par opposition à l'écran de fumée complet qu'il était pour moi avant. Merci encore – Jubbsee