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は「name」をpublicに設定しようとしましたが、それでも同じエラーが発生します。また、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

「setNameメソッドをコメントアウトするとコンパイルされます」

プログラムに「setNameメソッド」がありません(問題のある定義を参照)。と呼ばれる完全に独立したグローバル関数を定義しましたsetNameが、これは何の「メソッド」でもありません。メソッド、つまりクラスのメンバー関数を定義する場合は、class_name::method_name形式を使用してメソッドを参照する必要があります。それはAnimal::setNameあなたの場合です。

于 2010-08-16T17:11:20.550 に答える
1

ヒントは「非メンバー関数」でした。

関数をメンバー関数にする必要があります。

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