C++ &引用;“分配抽象类类型的对象”;错误,尽管所有函数都有实现

C++ &引用;“分配抽象类类型的对象”;错误,尽管所有函数都有实现,c++,abstract-class,pure-virtual,C++,Abstract Class,Pure Virtual,我知道关于这个错误的问题已经被反复问过了,但是之前的答案似乎都不能解决我的问题 我有一个纯抽象类ITile: class ITile { public: virtual ~ITile() {} virtual void display() = 0; virtual bool isWalkable() = 0; virtual bool isGoal() = 0; }; 三个子类都实现了这些功能,如下所示: Floor.h #include "ITile.h"

我知道关于这个错误的问题已经被反复问过了,但是之前的答案似乎都不能解决我的问题

我有一个纯抽象类
ITile

class ITile {
public:
    virtual ~ITile() {}
    virtual void display() = 0;
    virtual bool isWalkable() = 0;
    virtual bool isGoal() = 0;
};
三个子类都实现了这些功能,如下所示:

Floor.h

#include "ITile.h"

class Floor : public ITile {
public:
    Floor();
    virtual ~Floor();
    virtual void display() override;
    virtual bool isWalkable() override;
    virtual bool isGoal() override;
};
Floor.cpp

#include "Floor.h"
#include <iostream>
using namespace std;

Floor::Floor() {}
Floor::~Floor() {}

void Floor::display() {
   cout << " ";
}

bool Floor::isWalkable() {
    return true;
}

bool Floor::isGoal() {
    return false;
}
#包括“Floor.h”
#包括
使用名称空间std;
地板::地板(){}
楼层::~Floor(){}
void Floor::display(){

不能声明
std::vector
,因为
ITile
s不能存在

为了利用容器中的多态性,您需要存储指针。这些指针将指向动态分配的对象,类型为
地板
天花板
…以及其他类型的对象


假设std::vector是一个抽象类

对于C++11之前的编译器,您无法创建
std::vector
std::vector
只能用于可复制构造和可复制分配的类型。抽象类既不可复制构造,也不可复制分配

如果您使用的是C++11或更高版本的编译器,则该类型不需要可复制构造和可复制分配来构造
std::vector
。其他成员函数可能会施加这些要求。如果您的编译器不严格遵守,则它将无法为此类类型构造
std::vector

更多信息:


你的例子中有点太小了。请发布一个@NathanOliver:这不是太小,而是它不完整。他缺少将所有东西联系在一起的
main
函数。几乎可以肯定的是,这个函数使用了
vector
。看起来你正在创建一个
std::vector
。你可以不要这样做,因为ITile
是一个抽象类。你不应该发布“完整的项目”。你应该发布一个。坦率地说,如果你还没有编写一个,那么在发布到这里之前你还没有完成自己的调试。此外,当你发布一些不是MCVE的内容时,这个问题很可能对未来的访问者没有任何好处(因为这可能是关于你的代码的问题,而不是关于编程语言的问题),这是在这个网站上提问的先决条件。在被告知这一切后,你还没有勃然大怒,所以就我而言,你没事。下次我只是想知道一个空的
std::vector
是否可以(虽然没用)从C++11开始,只要不调用任何需要可复制构造或可复制分配类型的操作,就可以看到抽象类不是不完整的类型。@ChristianHackl:不确定实现的标准要求是多少。如果一个向量要为5
ITile
s保留足够的空间,那还可以吗?我是说lise它只需要知道
sizeof(ITile)
,它可以做到这一点,在实践中,当稍后有人创建一些实际元素时,您可能会得到一块新的
字符。但这能保证吗?嗯。@ChristianHackl一致性实现应该允许这一点。存储在vector中的类型的要求由调用sai的函数强制执行d vector.和
vector::vector()
对底层类型没有任何要求。@SergeyA:那没关系。为了简单起见,我不会调整答案,但这是“好的”要知道。还有一点,RSahu,如果@LightnessRacesinOrbit足够幸运的话,他会到达那里的!
std::vector
本身没有强加任何要求,除了类型是可擦除的(并且在C++17之前完成)。要求仅由被调用的
向量
成员施加,并且仅当这些成员实际被调用时。
g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/main.d" -MT"src/main.d" -o "src/main.o" "../src/main.cpp"
In file included from ../src/main.cpp:1:
In file included from ../src/board.h:1:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/vector:265:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__bit_reference:15:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:627:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:1641:31: error: allocating an object of abstract class type 'ITile'
        ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
[...]