我最近拿起了一个我前段时间正在开发的应用程序。
不久之后,我偶然发现了继承问题。
我有一个名为 ModelBase 的基类,它有一个纯虚方法,使它成为一个抽象类。该课程如下所示:
#ifndef MODELBASE_H
#define MODELBASE_H
#include <QMetaType>
#include <QString>
class ModelBase
{
public:
ModelBase();
virtual ~ModelBase();
long getId() const;
void setId(const long id);
virtual QString toString() const = 0;
private:
long m_id;
};
Q_DECLARE_METATYPE(ModelBase)
#endif // MODELBASE_H
在阅读其余代码时,可能需要记住它被声明为 METATYPE 的事实。
我从这个基类派生了几个类。对于这个例子,我将使用给我带来最多问题的两个。
#ifndef PLATFORM_H
#define PLATFORM_H
#include <QDate>
#include "modelbase.h"
#include "game.h"
class Platform : ModelBase
{
public:
Platform();
~Platform();
QString toString() const;
QString getName();
QDate getPublishDate();
void setName(QString name);
void setPublishDate(QDate publishDate);
private:
QString m_name;
QDate m_publishDate;
QList<Game*> m_games;
};
#endif // PLATFORM_H
如您所见,标头还包括来自父类 ModelBase 的虚拟方法。
最后但并非最不重要的; 问题类:
#ifndef GAME_H
#define GAME_H
#include <QDate>
#include "modelbase.h"
class Platform;
class Publisher;
class Genre;
class Game : ModelBase
{
public:
Game();
~Game();
QString getTitle();
Publisher* getPublisher();
Genre* getGenre();
Platform* getPlatform();
QDate getPublishDate();
QString getLentTo();
void setTitle(QString title);
void setPublisher(Publisher &publisher);
void setGenre(Genre &genre);
void setPlatform(Platform &platform);
void setPublishDate(QDate date);
void setLentTo(QString lentTo);
QString toString() const;
private:
QString m_title;
Publisher *m_publisher;
Genre *m_genre;
Platform *m_platform;
QDate m_publishDate;
QString m_lentTo;
};
#endif // GAME_H
现在代码已经到位......
第一个问题来自循环依赖。
一个平台有很多游戏,一个游戏有一个平台。
我通过在 games.h 中前向声明平台并在 platform.h 中包含 games.h 解决了这个问题
既然这已经解决了,我编译了我的程序并得到了以下我真的不明白的抱怨。
xxxxx\mingw47_32\include\QtCore\qmetatype.h:382: error: cannot allocate an object of abstract type 'ModelBase'
好吧,很公平..但我从来没有真正直接在类中定义 ModelBase。只能从它派生。
我在同一个日志中得到的另一个错误是:
xxxx\mingw47_32\include\QtCore\qmetatype.h:-1: In instantiation of 'static void* QtMetaTypePrivate::QMetaTypeFunctionHelper<T, Accepted>::Create(const void*) [with T = ModelBase; bool Accepted = true]':
我真的不知道这里发生了什么。
我尝试在games.h中根本不使用指针,但后来我得到了我也不理解的不同类型的编译器错误;
xxxx\game.h:38: error: field 'm_platform' has incomplete type
我尝试过同时使用#include 和前向声明,但它们都给他们带来了一些问题。另请注意,如果在games.h文件中我将前向类声明替换为includes(platform.h除外,这将带回循环依赖问题),则所有问题的类型都不完整(m_platform除外,因为据我所知,我别无选择,只能转发声明)
我假设我不知道这种继承应该如何在这里工作。
我将 ModelBase 定义为元类型的原因是因为我希望 ModelBase 及其子项在 QVariant 中/从 QVariant 中包装/解包