Inhertitance +使用object(this)作为参数

时间:2017-01-15 11:53:48

标签: c++ inheritance 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

当我尝试编译时,标记行中出现错误:

  

&#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);

1 个答案:

答案 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%的情景向量中的建议优于列表,我有强烈的感觉,你不需要列表。我建议再次检查两者之间的差异。