繁体   English   中英

C ++“未在此范围内声明的变量” - 再次

[英]C++ “Variable not declared in this scope” - again

我想这是一个非常简单的问题,可能是一个已经多次回答的问题。 但是,我真的对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方法,它会编译。 我尝试将'name'设置为public并仍然得到相同的错误。 我也尝试在setName()中使用“this-> name = _name”,这导致“在非成员函数中无效使用'this'”。

我不知道还有什么可以搜索的。 提前致谢。

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

应该

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

如果使用this参数,则需要拥有Animal:: 没有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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM