C ++ "Переменная не объявлена ​​в этом объеме" - снова

StackOverflow https://stackoverflow.com/questions/3495449

Вопрос

Я предполагаю, что это действительно простой вопрос и, вероятно, тот, который ответил несколько раз. Тем не менее, я действительно отстой в 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 в твоем случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top