【问题标题】:How do i use an Array of abstract objects? Invalid abstract type error如何使用抽象对象数组?无效的抽象类型错误
【发布时间】:2019-06-24 19:07:30
【问题描述】:

我正在用 C++ 编写一个国际象棋游戏,Player 有一个包含 16 个 pieces 的数组,这是每个独立棋子(马、典当、国王等)。编译器给了我一个“'pecas'的无效抽象类型'Peca'。我做错了什么?谢谢!

播放器.h

#include "Peca.h" // Includes Piece abstract class

using std::string;

class Jogador
{
    private:
        static int numeroDeJogador; //PlayerNumber (0-1)
        string nome;
        Peca pecas[16]; //This is the array of the abstract class Pecas (Pieces), where i want to put derived objects like Horse, king..

    public:
        string getNomeJogador(); // Return the player name

};

Pieces.h

#ifndef PECA_H
#define PECA_H
#include <string>

using std::string;

class Peca {

    private:
        int cor; //0 para as brancas, 1 para as pretas
        bool emJogo;

    public:
        Peca(int cor);
        virtual string desenha() = 0;
        virtual bool checaMovimento(int linhaOrigem, int colunaOrigem, int linhaDestino, int colunaDestino) = 0;
        int getCor();
        bool estaEmJogo();
        void setForaDeJogo(bool estado);
};
#endif

派生类示例:

#include "Peca.h"

using std::string;

class Cavalo : public Peca {
    public:
        Cavalo(int cor);
        bool checaMovimento(int linhaOrigem, int colunaOrigem, int linhaDestino, int colunaDestino);
        string desenha();
};

【问题讨论】:

  • *"如何使用抽象对象数组?"你没有。您可以使用指针(最好是智能型)或引用包装器(并且您最好知道自己在做什么,所以选择 A 计划)。仅供参考,数组与此无关。如果您尝试将单个 Peca 实例化为成员,也会发生同样的问题。这是一个实例+多态性问题;不是数组问题。
  • "这是抽象类 Pecas (Pieces) 的数组,我想在其中放置派生对象,例如 Horse, king" - 但总是有有意义吗每个Jogador 16 件?如果容器在大多数情况下可以保留更少而在需要时可以保留更多,难道不是更好吗?
  • “如果容器在大多数情况下可以保留更少而在需要时可以保留更多,难道不是更好吗?”我认为实现游戏的方式是两个玩家都有独特的棋子数组。然后,当游戏必须访问它时,可以从索引中知道哪一块是,如果它还活着,它的位置。这就是为什么我认为最好有一个数组,因为它更容易传递给其他对象

标签: c++ oop abstract


【解决方案1】:

数组要求数组的对象是可构造的。你不能构造一个Peca,所以你不能拥有它们的数组。

您需要的是指向Peca 的指针容器。指针总是可构造的,即使它们指向的东西不能。在这种情况下,您可以使用std::array&lt;std::unique_ptr&lt;Peca&gt;, 16&gt; pecas,这样您就有了一个托管指针数组。

【讨论】:

  • 哇,到目前为止我们还没有合适的副本吗??
  • @πάνταῥεῖ 它可能由于转移而丢失了。它与数组无关。如果成员只是 Peca obj; 数组会增加相同的问题,因为它们需要具体初始化 all 插槽,但根本问题是简单地尝试实例化一个抽象基,而我'm确定为此存在一个或两个(或几十个)副本。
猜你喜欢
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多