编辑:从标题文件添加代码。
现在我正在进行某种模拟,并且出现了一些问题。 我有一些类似下面这样的课程:
#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
当我尝试编译时,标记行中出现错误:
&#34;之前的预期类名,&#34;令牌
在我添加指向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;
};
和battlewindow.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);
答案 0 :(得分:0)
此代码存在一些问题。
首先你可能编译的问题是因为你错过了Martin Broadhurst在他的回答中注意到的分号。
此外,TABLE [dbo].[TBL_Sku6](
[SKU1] [varchar](7996) NULL,
[SKU2] [varchar](7996) NULL,
[SKU3] [varchar](7996) NULL,
[SKU4] [varchar](7996) NULL,
[SKU5] [varchar](7996) NULL,
[SKU6] [varchar](7996) NULL
) ON [PRIMARY]
和cjednostka.h
之间存在循环依赖关系。
由于cjednostka.h只有一个接口类,所以删除include并添加battlewindow.h
的前向声明,就像你在class BattleWindow
中所做的那样
下一个问题是您为CJednostka创建了一个纯虚拟接口,但它没有虚拟析构函数。这非常糟糕,最终会导致通过基指针不正确地破坏对象。
在cjednostka.h中试试这个
cartyleria.h
另外,我建议在所有头文件中使用标题保护,或者在#pragma中使用一次。只需坚持一个选项,并在每个标题中执行此操作。
标题的另一个问题是,在其中一个标题中,您将自己的标题包含为#ifndef CJEDNOSTKA_H
#define CJEDNOSTKA_H
class CJednostka
{
public:
CJednostka();
virtual ~CJednostka() = default;
virtual void rysuj (BattleWindow *okno) =0;
};
#endif
而不是#include <coddzial.h>
,这可能会导致问题,因为&lt;&gt;存在差异vs&#34; &#34 ;.第一个搜索库包含路径,后者查找相对于项目文件的文件,这很可能是你想要的。
最后,90%的情景向量中的建议优于列表,我有强烈的感觉,你不需要列表。我建议再次检查两者之间的差异。