2017-01-15 47 views
1

編輯:從標題文件添加代碼。Inhertitance +使用對象(this)作爲參數

現在我正在進行某種模擬,並且出現了一些問題。 我有一些類像下面這樣:

#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_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; 
}; 

我想要做的是:

S中對象的調用方法TL名單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); 
+3

因此,你添加了'okno'參數,然後你得到了定義基類的行的錯誤?這聽起來不對。就目前來看,你還沒有提供足夠的代碼。我們不知道你的三個'* .h'文件中有什麼。 –

+0

這是一個常見的原因,其中一個包含文件反過來包含此文件(一個循環包含),並且當文件被第二次讀取並且已經定義了包含保護時發生錯誤。 –

+0

如果您轉發聲明戰鬥窗口,則可以刪除包含聲明。這可能會有所幫助。 – Soeren

回答

0

有幾個與此代碼的問題。

首先,您可能要編譯的問題是因爲您錯過了Martin Broadhurst在他的答案中注意到的分號。

此外,您還有一個循環依賴cjednostka.hbattlewindow.h

由於cjednostka.h只有一個接口類中刪除包含並添加一個向前聲明class BattleWindow就像你在cartyleria.h

下一個問題所做的是您創建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"這可能會導致問題,因爲<>和「」之間存在差異。第一個搜索庫包含路徑後者查找相對於您的項目文件的文件,這很可能是你想要的。

最後,在90%的場景向量中的建議優於列表,我有強烈的感覺,你不需要列表。我建議再次檢查兩者之間的差異。

+0

夥計們,我試圖解決指出的問題,但還有其他幾個問題。當我在父類中添加類聲明時:CJednostka是否有必要在繼承類中再次執行它,他們是否具有知識並對其進行訪問? – BBq

+0

@BBq閱讀一本關於C++類和繼承的書或教程。我不確定'父類中的類聲明'是什麼意思。 –