gpt4 book ai didi

c++ - 继承+使用对象(this)作为参数

转载 作者:太空宇宙 更新时间:2023-11-04 13:07:12 24 4
gpt4 key购买 nike

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

现在我正在进行某种模拟,并且出现了一些问题。我有一些像下面这样的类(class):

#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

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

expected class-name before "," token

一切正常,直到我添加指向 BattleWindow 对象的指针。

调用 CArtyleria 方法是好的做法吗

this

在 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);

最佳答案

这段代码有几个问题。

首先,您可能遇到的编译问题是因为您缺少分号,就像 Martin Broadhurst 在他的回答中注意到的那样。

此外,cjednostka.h 之间存在循环依赖关系和 battlewindow.h .

因为 cjednostka.h 只有一个接口(interface)类,删除包含并为 class BattleWindow 添加前向声明就像你在 cartyleria.h 中所做的那样

下一个问题是您为 CJednostka 创建了一个纯虚拟接口(interface),但它没有虚拟析构函数。这是非常糟糕的,最终会导致通过基指针不正确地销毁对象。

在 cjednostka.h 中试试这个

#ifndef CJEDNOSTKA_H
#define CJEDNOSTKA_H
class CJednostka
{
public:
CJednostka();
virtual ~CJednostka() = default;
virtual void rysuj (BattleWindow *okno) =0;
};
#endif

我还建议在所有头文件中使用头文件保护或使用#pragma once。只需坚持一个选项,并在每个标题中都这样做。

header 的另一个问题是,在其中一个 header 中,您将自己的 header 包含为 #include <coddzial.h>而不是 #include "coodzial.h"这可能会导致问题,因为 <> 与 ""之间存在差异。第一个搜索库包含路径,后者查找与您的项目文件相关的文件,这很可能是您想要的。

最后一个建议在 90% 的场景中 vector 优于列表,我强烈认为你不需要列表。我建议再次检查两者之间的差异。

关于c++ - 继承+使用对象(this)作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660786/

24 4 0
文章推荐: jquery - wysihtml5 对齐方式不正确
文章推荐: html - 为什么 <input> 的行为不像普通的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com