C ++ "Переменная не объявлена в этом объеме" - снова
Вопрос
Я предполагаю, что это действительно простой вопрос и, вероятно, тот, который ответил несколько раз. Тем не менее, я действительно отстой в 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 попробовал настроить «имя» для публики, и все же получите ту же ошибку. Я также попробовал использовать «This-> name = _Name» в SETNAME (), который приводит к «недействительному использованию« это »в функции не-члена».
Я не знаю, что еще искать. Заранее спасибо.
Решение
void setName( char* _name )
{
name = _name;
}
должно быть
void Animal::setName( char* _name )
{
this->name = _name;
}
Тебе нужно иметь Animal::
Если вы используете this
параметр. Без Animal::
Это думает, что вы просто создаете новую глобальную функцию под названием setName
Другие советы
Как вы написали код setName
Бесплатная функция, а не функция участника. По этой причине компилятор не может решить name
.
Вам придется изменить setname на это:
void Animal::setName( char* _name )
{
name = _name;
}
Подсказка была «функция не члена».
Вы должны сделать функцию в функцию участника:
void Animal::setName( char* _name )
{
name = _name;
}
«Он компилируется, если я прокомментирую метод setname»
В вашей программе нет «метода setname» в вашей программе (ссылаясь на проблематичное определение). Вы определили полностью независимую глобальную функцию setName
, который не является «методом» чего-либо. Если вы хотите определить метод, то есть функция члена класса, вы должны обратиться к нему, используя class_name::method_name
формат. Это было бы Animal::setName
в твоем случае.