【问题标题】:c++ passing subclass as parameterc ++将子类作为参数传递
【发布时间】:2017-05-30 10:58:18
【问题描述】:

我有一个名为 Obje 的超类

#ifndef OBJE_H
#define OBJE_H

#include <QString>

class Obje
{
    public:
    Obje();
    QString name="";
    int id;
    int itemid=0;
    void setItemid(int i);
    virtual void update(){};
};

#endif // OBJE_H

我有一个名为 Npc 的子类

#ifndef NPC_H
#define NPC_H

#include "obje.h"
#include "QString"
#include "QPixmap"
class Npc : public Obje
{
public:

    Npc(QString dir="left");
    QString direction="left";

    QPixmap* spriteSheet = nullptr;
    QPixmap face;
    QPixmap sprites[3];
    void update(int nid);
    QPixmap* getCurrentSprite();
    int currentFrame;
    QString frameDirection;

};

#endif // NPC_H

我还有一个类来管理 listWidgets

class ListUpdate
{
public:
    ListUpdate();
    static void update(QListWidget *q, vector<Obje>& i);

    private:
    static struct item{
        QString id;
        QString name;
        QPixmap px;
    };

    static QListWidgetItem* newItem(ListUpdate::item &i, int c);
};

#endif // LISTUPDATE_H

当我尝试将类型为向量“Npc”的名为“npcs”的对象传递给 ListUpdate::update 时,会出现此错误 传递向量:

ListUpdate::update(ui->listWidget,npcs);

错误:

C:\Qt Projects\RpgEditor\npcscreen.cpp:64: error: C2665: 'ListUpdate::update': none of the 3 overloads could convert all the argument types

注意:我还有 2 个其他重载函数,我没有在这里写它们以防止不必要的混淆(这就是为什么它说,“没有 3 个重载”)

为什么它不接受我的子类?

【问题讨论】:

  • 你能提供npcs的定义吗?
  • 你的 npc 是 std::vector 类型的吗?
  • 是的,它没有显示 ,我试图通过编辑来解决这个问题
  • 是的,它的类型是 std::vector
  • 使用getter和setter而不是成员变量

标签: c++ qt inheritance


【解决方案1】:

base 类和派生 类之间的关系不会扩展到容器(少数特殊情况除外)。 std::vector&lt;Npc&gt; 不能转换为 std::vector&lt;Obje&gt;。也许您可以像这样模板化update 方法:

template<class T>
static void update(QListWidget *q, vector<T>& i);

此解决方案适用于与 Obje 的预期接口匹配的任何类型的向量,包括但不限于公开派生自 Obje 的类型。

【讨论】:

  • 哦,我明白了,我怀疑使用容器是问题所在。不幸的是,我不知道使用模板,但也许我应该研究一下。谢谢
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2016-06-27
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多