Inertitance+使用对象(this)作为参数
Inhertitance + using object (this) as an argument
现在我正在进行某种模拟,出现了一些问题。我有一些像下面这样的课程:
#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;
};
和战窗。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);
此代码有几个问题。
首先,你可能会遇到编译问题,因为你错过了马丁·布罗德赫斯特在回答中注意到的分号。
此外,cjednostka.h
和battlewindow.h
之间存在循环依赖关系。
由于cjednostka.h只有一个接口类,所以像在cartyleria.h
中那样,删除include并添加class BattleWindow
的前向声明
下一个问题是为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"
,这可能会导致问题,因为<>vs"。第一个搜索库Include路径,后者查找相对于项目文件的文件,这很可能是您想要的。
最后,在90%的场景中,有一个建议向量优于列表,我有一种强烈的感觉,你不需要列表。我建议再检查一下两者之间的区别。
- 了解'this'或其他参数是否为右值
- C++ Boost - 序列化错误 - 将"const B"作为"this"参数
- 成员函数的"this"参数具有"const"类型,但我的函数实际上不是"const"
- 整体模板参数。错误:在常量表达式中使用'this'
- 有没有办法绕过错误"因为'this'参数会丢弃限定符?
- 传递'const QVariant' 'this'参数会丢弃限定符 [-允许]
- C++错误:将"const umap_int {aka const std::unordered_map<int, int>}"作为"this"参数会丢弃限定符 [-permissive]
- 错误:将 x 作为 x 的参数传递'this'丢弃限定符
- C++ 不允许将'this'用作非类型模板参数
- const std::unordered_map<char, int>' 因为 'this' 参数会丢弃 lambda 中的限定符
- 为什么有必要将"this"指针作为"arg"参数传递给pthread_create
- 在模板类中使用"this"会导致参数初始化错误
- 错误:将“const sdf”作为“this”参数传递会丢弃限定符 [-fpermissive]
- 视觉C++:即使使用关键字,参数声明也会隐藏类成员"this"
- 错误:候选函数不可行:'this'参数具有类型 'const' 但方法未标记为 const
- 错误:将'xxx'作为'xxx'丢弃限定符的参数传递'this' [-允许]
- 用static_cast(*this)...初始化可变参数CRTP:<Base>合法吗?
- C++集合方法:函数'setCost'不可行:'this'参数的类型'const value_type'
- 如何理解C++隐式参数"this"
- C++:何时应该通过引用使用 PLUS 参数"this->"