【问题标题】:Inhertitance + using object (this) as an argument继承 + 使用对象 (this) 作为参数
【发布时间】:2017-01-15 11:53:48
【问题描述】:

编辑:从标题文件中添加代码。

现在我正在做某种模拟,但出现了一些问题。 我有一些像下面这样的课程:

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

而我想做的是:

STL列表中对象的调用方法std::list&lt;CJednostka*&gt; jednostki_do_narysowania;

现在实现如下:

for(std::list <CJednostka*>::iterator it=jednostki_do_narysowania.begin();it!=jednostki_do_narysowania.end();++it){

        (*it)->rysuj(this);

【问题讨论】:

  • 所以您添加了okno 参数,然后定义基类的行出现错误?这听起来不对。就目前而言,您没有提供足够的代码。我们不知道您的三个 *.h 文件中有什么内容。
  • 这种情况的常见原因是其中一个包含文件又包含该文件(循环包含),并且在已定义包含保护的情况下第二次读取该文件时会发生错误。
  • 如果转发声明battlewindow,可以删除include语句。这可能会有所帮助。
  • 尝试删除“battlewindow.h”的包含,因为您已经向前声明了 BattleWindow 类并且您只作为指针传递,因此不需要完整的定义。顺便说一句,在您的代码中坚持使用一种语言,混合两种语言并不是一个好主意;)
  • 就像我之前说的。但是你的语言是对的。阅读代码非常困难,您不知道代码应该做什么。

标签: c++ inheritance this


【解决方案1】:

这段代码有几个问题。

首先,您可能在编译时遇到的问题是因为您缺少像 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 &lt;coddzial.h&gt; 而不是#include "coodzial.h",这可能会导致问题,因为 与“”之间存在差异。第一个搜索库包含路径,后者查找与您的项目文件相关的文件,这很可能是您想要的。

最后,在 90% 的场景中,向量优于列表的建议,我强烈感觉您不需要列表。我建议再次检查两者之间的差异。

【讨论】:

  • 伙计们,我正在尝试解决指出的问题,但还有一些其他问题。当我在父类中添加类声明时:CJednostka 是否有必要在继承的类中再次这样做,他们是否了解并访问它?
  • @BBq 阅读有关 C++ 类和继承的书籍或教程。我不确定“在父类中添加类声明”是什么意思。
猜你喜欢
  • 2019-07-20
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多