Inertitance+使用对象(this)作为参数

Inhertitance + using object (this) as an argument

本文关键字:参数 this 对象 Inertitance+      更新时间:2023-10-16
编辑:从标题文件中添加代码。

现在我正在进行某种模拟,出现了一些问题。我有一些像下面这样的课程:

#ifndef CARTYLERIA_H
#define CARTYLERIA_H
#include "cjednostka.h"
#include "cnieruchome.h"
#include "battlewindow.h"
class BattleWindow;
class CArtyleria : public CJednostka, public CNieRuchome <------ error line
{
public:
CArtyleria();
void rysuj(BattleWindow *okno);
};
#endif // CARTYLERIA_H

当我试图编译时,在标记的行中出现了一个错误:

在","标记之前需要类名

在我添加指向BattleWindow对象的指针之前,一切都正常工作。

用调用CArtyleria方法是一种好的做法吗

BattleWindow类对象中的

Cjednostka.h:

#include "battlewindow.h"
class CJednostka
{
public:
CJednostka();
virtual void rysuj (BattleWindow *okno) =0;
}

CNieRuchome.h:

class CNieRuchome
{
public:
CNieRuchome();
protected:
int PozycjaX;
int PozycjaY;
};

和战窗。h:

#include <coddzial.h>
#include "main.h"
#include "ctimer.h"
#include "cpotyczka.h"
#include "cjednostka.h"
namespace Ui {
class BattleWindow;
}
class CPotyczka;
class BattleWindow : public QMainWindow
{
Q_OBJECT
public:
CPotyczka *potyczka;
void tworz_oddzial();
explicit BattleWindow(QWidget *parent = 0);
~BattleWindow();
std::vector <QGraphicsPixmapItem*> items_vector;
void dodaj_jednostki(std::vector<QString> jednostki, QString frakcja);
void rysuj_jednostke(QString jednostka, QString frakcja, int x, int y);
private slots:
void on_now();
private:
QGraphicsScene *scene;
Ui::BattleWindow *ui;
CTimer *timer;

void rysuj_jednostki(QString frakcja);
void rysuj_plansze ();
void rysuj_flagi ();
void usun_jednostke (QGraphicsPixmapItem *item);
std::list<CJednostka*> jednostki_do_narysowania;
};

我想做的是:

STL列表std::list<CJednostka*> jednostki_do_narysowania;中对象的调用方法

现在实现如下:

for(std::list <CJednostka*>::iterator it=jednostki_do_narysowania.begin();it!=jednostki_do_narysowania.end();++it){
(*it)->rysuj(this);

此代码有几个问题。

首先,你可能会遇到编译问题,因为你错过了马丁·布罗德赫斯特在回答中注意到的分号。

此外,cjednostka.hbattlewindow.h之间存在循环依赖关系。

由于cjednostka.h只有一个接口类,所以像在cartyleria.h中那样,删除include并添加class BattleWindow的前向声明

下一个问题是为CJednostka创建一个纯虚拟接口,但它没有虚拟析构函数。这是非常糟糕的,最终会导致通过基指针对对象进行不适当的破坏。

在cjednostka.h 中试试这个

#ifndef CJEDNOSTKA_H
#define CJEDNOSTKA_H
class CJednostka
{
public:
CJednostka();
virtual ~CJednostka() = default;
virtual void rysuj (BattleWindow *okno) =0;
};
#endif

此外,我建议在所有头文件中使用头保护,或者一次使用#pragma。只需坚持一个选项,并在每个标题中都这样做。

标头的另一个问题是,在其中一个标头中,您将自己的标头包含为#include <coddzial.h>而不是#include "coodzial.h",这可能会导致问题,因为<>vs"。第一个搜索库Include路径,后者查找相对于项目文件的文件,这很可能是您想要的。

最后,在90%的场景中,有一个建议向量优于列表,我有一种强烈的感觉,你不需要列表。我建议再检查一下两者之间的区别。