저는 최근 얼마 전 일하고 있던 응용 프로그램을 선택했습니다.Qt 상속 및 인스턴스화 문제
나는 상속에 관한 문제를 이미 우연히 발견 한 직후입니다.
나는 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
그것이 메타 타입으로 선언되어 있다는 사실은 아마 코드의 나머지 부분을 읽기 위해 명심해야 할 일이다.
이 기본 클래스에서 여러 클래스를 파생 시켰습니다. 이 예제에서는 가장 문제가되는 두 가지를 사용하겠습니다.
#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에 플랫폼을 선언하고 이제 길에서 것을
platforms.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 파일에서 include (전제 종속성 문제를 가져 오는 platform.h 제외)와 함께 포워드 클래스 선언을 바꾼다면 모든 문제는 불완전한 형태의 dissapear를 가지고 있습니다 (m_platform 제외). 왜냐하면 내가 아는 한, , 나는 선택의 여지가 있지만 앞으로 선언해야한다)
나는이 상속이 어떻게 작동해야하는지에 대한 지식이 없다고 가정한다.
내가 메타 타입으로 ModelBase를 정의하는 이유는 내가 QVariant
흥미 롭습니다. 그리고 [그들의 문서] (http://qt-project.org/doc/qt-4.8/custom-types.html)는 클래스가 추상적 일 수 있는지 여부를 말하지 않습니다. –
atleast에 대해 아무 것도 찾을 수 없었습니다. : P –
당신은 사적 상속을 사용하고 있다는 사실을 알고 있습니까? 대신 공용 상속을 사용해보십시오. –