2

我想这是一个非常简单的问题,并且可能已经被多次回答过。但是,我真的很讨厌 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文件。正如你所看到的,非常简单的东西,但是,每当我尝试编译时,我都会得到:“错误:'name'没有在这个范围内声明”。

如果我注释掉 setName 方法,它就会编译。Iv 尝试将“名称”设置为公开,但仍然出现相同的错误。我还尝试在 setName() 中使用“this->name = _name”,这会导致“在非成员函数中无效使用 'this'”。

我不知道还要搜索什么。提前致谢。

4

4 回答 4

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

应该

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

Animal::如果你使用this参数,你需要有。如果没有Animal::它,您会认为您只是在创建一个名为的新全局函数setName

于 2010-08-16T17:06:48.887 回答
4

您编写代码的方式setName是自由函数,而不是成员函数。因此,编译器无法解析name.

您必须将 setName 更改为此:

void Animal::setName( char* _name )
{
  name = _name;
}
于 2010-08-16T17:10:08.940 回答
1

提示是“非成员函数”。

您需要将该函数变为成员函数:

void Animal::setName( char* _name )
{
 name = _name;
}
于 2010-08-16T17:07:54.000 回答
1

“如果我注释掉 setName 方法,它就会编译”

您的程序中没有“setName 方法”(参考有问题的定义)。您定义了一个名为 的完全独立的全局函数setName,它不是任何事物的“方法”。如果你想定义一个方法,即一个类的成员函数,你必须使用class_name::method_name格式来引用它。你的情况就是Animal::setName这样。

于 2010-08-16T17:11:20.550 回答