Bearbeiten: Code aus Überschriften Datei hinzugefügt.Vererbung + Verwendung von Objekt (this) als Argument
Im Moment arbeite ich an einer Art von Simulation, und einige Probleme traten auf. Ich habe einige Klassen wie diese unter:
#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
Und wenn ich versuche, es zu kompilieren, ist ein Fehler in der markierten Linie:
erwartete Klassennamen vor „“ Token
Alles funktionierte ordnungsgemäß, bis ich den Zeiger zum BattleWindow-Objekt hinzufüge.
ist es gute Praxis CArtyleria Methode aufzurufen mit
diese
in BattleWindow Klassenobjekt?
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;
};
Und 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;
};
Und was ich tun möchte, ist:
Aufrufmethode für Objekte in S TL Liste std::list<CJednostka*> jednostki_do_narysowania;
Gerade jetzt ist es wie unten realisiert:
for(std::list <CJednostka*>::iterator it=jednostki_do_narysowania.begin();it!=jednostki_do_narysowania.end();++it){
(*it)->rysuj(this);
Also haben Sie das Argument 'okno' hinzugefügt und dann haben Sie einen Fehler für die Zeile bekommen, die die Basisklassen definiert? Das klingt nicht richtig. Wie es aussieht, haben Sie nicht genug Code zur Verfügung gestellt. Wir wissen nicht, was in deinen drei '* .h' Dateien steht. –
Eine häufige Ursache hierfür ist, dass eine der Include-Dateien wiederum diese Datei enthält (ein zirkuläres Include) und der Fehler auftritt, wenn die Datei ein zweites Mal mit dem bereits definierten Include-Guard gelesen wird. –
Wenn Sie das Battlewindow weiterleiten, können Sie die Include-Anweisung löschen. das wird wahrscheinlich helfen. – Soeren