C ++ «Переменная не объявлена ​​в этой области» - снова - PullRequest
2 голосов
/ 16 августа 2010

Полагаю, это действительно простой вопрос и, возможно, на него уже несколько раз ответили. Тем не менее, я действительно сосу на C ++ и искал безрезультатно для решения. Буду очень признателен за помощь.

В основном:

#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

Файл заголовка, где:

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

- это файл C. Как видите, очень простые вещи, но я получаю: «ошибка: имя не было объявлено в этой области» всякий раз, когда я пытаюсь скомпилировать.

Компилируется, если я закомментирую метод setName. Iv попытался установить 'name' для public и все еще получал ту же ошибку. Я также пытался использовать «this-> name = _name» в setName (), что приводит к «недопустимому использованию« this »в функции, не являющейся членом».

Я не знаю, что еще искать. Заранее спасибо.

Ответы [ 4 ]

9 голосов
/ 16 августа 2010
void setName( char* _name )
{
 name = _name;
}

должно быть

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

Вам нужно иметь Animal::, если вы используете параметр this. Без Animal:: он думает, что вы просто создаете новую глобальную функцию с именем setName

4 голосов
/ 16 августа 2010

То, как вы написали код setName, является бесплатной функцией, а не функцией-членом. По этой причине компилятор не может разрешить name.

Вам нужно изменить setName на это:

void Animal::setName( char* _name )
{
  name = _name;
}
1 голос
/ 16 августа 2010

"Он компилируется, если я закомментирую метод setName"

В вашей программе нет "метода setName" (имеется в виду проблемное определение). Вы определили полностью независимую глобальную функцию с именем setName, которая не является «методом» чего-либо. Если вы хотите определить метод , то есть функцию-член класса, вы должны ссылаться на него в формате class_name::method_name. Это было бы Animal::setName в вашем случае.

1 голос
/ 16 августа 2010

Подсказка была "не-функция-функция".

Вам необходимо превратить функцию в функцию-член:

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