3个类之间具有循环依赖关系并具有继承的问题

时间:2017-06-02 00:14:20

标签: c++ g++ polymorphism

我是一名大学一年级学生,对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;弄清楚要做什么。我很感激你的帮助!如果您需要更多信息或其他内容,请告诉我,因为这是我第一次发帖提问。

2 个答案:

答案 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

使用多态(虚函数)时,必须始终使基类析构函数为虚拟。也可以将派生类析构函数设置为虚拟,但这不是必需的。