编辑:从标题文件添加了代码。现在,我正在进行某种模拟,并且出现了一些问题。我下面有一些这样的课程:#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;};而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_OBJECTpublic: 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); 最佳答案 这段代码有两个问题。首先,您可能要编译的问题是因为您缺少像Martin Broadhurst在其答案中注意到的分号。另外,您在cjednostka.h和battlewindow.h之间具有循环依赖关系。由于cjednostka.h只有一个接口类,因此像在class BattleWindow中那样删除并为cartyleria.h添加前向声明。下一个问题是,您为CJednostka创建了一个纯虚拟接口,但是它没有虚拟析构函数。这是非常糟糕的,最终将导致通过基指针对对象的不当破坏。在cjednostka.h中尝试一下#ifndef CJEDNOSTKA_H#define CJEDNOSTKA_Hclass CJednostka{public: CJednostka(); virtual ~CJednostka() = default; virtual void rysuj (BattleWindow *okno) =0;};#endif另外,我建议在所有头文件中使用头保护或#pragma一次。只需坚持一个选项,并在每个标题中都这样做即可。标头的另一个问题是在其中一个标头中,您将自己的标头包含为#include <coddzial.h>而不是#include "coodzial.h",这可能会导致问题,因为与“”之间存在差异。第一个搜索库包含路径,后者搜索相对于项目文件的文件,这很可能是您想要的。最后,在90%的场景向量中,有一个建议优于列表,并且我强烈认为您不需要列表。我建议再次检查两者之间的差异。
10-04 20:07