我知道有关此错误的问题已被反复询问,但以前的答案似乎都没有解决我的问题。
我有一个纯粹的抽象类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)...);
[...]
......接着是一堆笔记。但问题是,我猜,上面最后一行的错误。
那么,这些algorithm
,memory
文件究竟是什么等等?我怎样才能摆脱这个错误?
我正在使用Eclipse Luna和Mac OS X(Mavericks)上的C / C ++插件以及Developer Command Line Tools。如有需要,欢迎提供更多信息。
提前致谢!
答案 0 :(得分:2)
您无法声明std::vector<ITile>
,因为ITile
不能存在。
为了在容器中使用多态,您需要存储指针。这些指针将指向动态分配的Floor
,Wall
,Ceiling
类型的对象......无论你有什么其他的。
考虑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