“分配抽象类类型的对象”错误,尽管所有函数都有实现

时间:2016-05-20 17:36:10

标签: 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"

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;
}

在尝试编译整个项目时,我得到以下输出:

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)...);
[...]

......接着是一堆笔记。但问题是,我猜,上面最后一行的错误。

那么,这些algorithmmemory文件究竟是什么等等?我怎样才能摆脱这个错误?

我正在使用Eclipse Luna和Mac OS X(Mavericks)上的C / C ++插件以及Developer Command Line Tools。如有需要,欢迎提供更多信息。

提前致谢!

2 个答案:

答案 0 :(得分:2)

您无法声明std::vector<ITile>,因为ITile不能存在。

为了在容器中使用多态,您需要存储指针。这些指针将指向动态分配的FloorWallCeiling类型的对象......无论你有什么其他的。

考虑std::vector<std::unique_ptr<ITile>>

答案 1 :(得分:1)

ITile是一个抽象类。

对于预C ++ 11编译器,您无法创建std::vector<ITile>std::vector只能用于CopyConstructible和CopyAssignable类型。抽象类既不是CopyConstructible也不是CopyAssignable。

如果您使用的是C ++ 11或更高版本的编译器,则该类型不必是CopyConstructible和CopyAssignable来构造std::vector。其他成员函数可能会强加这些要求。如果您的编译器不严格符合,则无法为这些类型构造std::vector

更多信息:

http://en.cppreference.com/w/cpp/container/vector http://en.cppreference.com/w/cpp/concept/CopyConstructible http://en.cppreference.com/w/cpp/concept/CopyAssignable