我是一名大学一年级学生,对CS一无所知,所以请相信我的新意,这是我在这里的第一个问题。
对于一项任务,我们正在使用虚拟版的Pokemon Go来练习在c ++中使用多态,并且我遇到了一些编译器错误。以下是三个文件,其中只包含代码示例:
#ifndef EVENT_H
#define EVENT_H
#include <string>
#include "Trainer.h"
class Event{
protected:
std::string title;
public:
Event();
~Event();
virtual void action(Trainer) = 0;
};
#endif
Trainer.h:
#ifndef TRAINER_H
#define TRAINER_H
#include "Pokemon.h"
class Trainer{
private:
Pokemon* pokemon;
int num_pokemon;
public:
Trainer();
~Trainer();
//include accessors and mutators for private variables
};
#endif
Pokemon.h:
#ifndef POKEMON_H
#define POKEMON_H
#include "Event.h"
#include <string>
class Pokemon : public Event{
protected:
std::string type;
std::string name;
public:
Pokemon();
~Pokemon();
virtual bool catch_pokemon() = 0;
};
#endif
trainer.h文件是每个口袋妖怪类型(例如Rock)的父类,它只定义了一些虚函数。我得到的错误是当我编译所有这些时,我得到的内容是:
Pokemon.h : 5:30: error: expected class-name befoer '{' token:
class Pokemon : Event {
宠物小精灵需要成为一个事件的派生类,这样一个事件指针可以指向另一个位置类可以指向一个小精灵,pokestop或洞穴进行分配,我一直在网上看了几个小时,可以& #39;弄清楚要做什么。我很感激你的帮助!如果您需要更多信息或其他内容,请告诉我,因为这是我第一次发帖提问。
答案 0 :(得分:0)
你需要一些前瞻声明。
在Event.h中,您可以放置# large image is 'frame'
# smale image is 'img'
frame[0:128, 872:1000] = img # copy img onto upper left frame
cv2.imshow('screen', frame)
cv2.waitKey(1000)
而不是class Trainer;
。在Trainer.h中,您可以放置#include "Trainer.h"
而不是class Pokemon;
。
您可能需要在相应的源文件中包含相应的标头,以便实际使用其他类。但是通过避免头文件中的包含,您可以摆脱循环依赖性问题。
Pokemon.h必须继续#include "Pokemon.h"
,因为你继承了#include "Event.h"
,这需要一个完整的定义。
答案 1 :(得分:0)
使用前向声明,告诉类他们需要使用的类型将在稍后定义。你可以在知道大小的情况下使用前向声明,指针和引用总是相同的大小,无论它们指向何种类型,所以使用它们。
#ifndef EVENT_H
#define EVENT_H
#include <string>
class Trainer;
class Event
{
protected:
std::string title;
public:
Event();
virtual ~Event();
virtual void action(Trainer* const trainer) = 0;
};
#endif
然后
#ifndef TRAINER_H
#define TRAINER_H
class Pokemon;
class Trainer
{
private:
Pokemon* const pokemon;
int numPokemon;
public:
Trainer();
~Trainer();
};
#endif
然后
#ifndef POKEMON_H
#define POKEMON_H
#include "Event.h"
#include <string>
class Pokemon : public Event
{
protected:
std::string type;
std::string name;
public:
Pokemon();
virtual ~Pokemon();
virtual bool catchPokemon() = 0;
};
#endif
使用多态(虚函数)时,必须始终使基类析构函数为虚拟。也可以将派生类析构函数设置为虚拟,但这不是必需的。