我一直在使用动态数组,但我必须添加和删除项目。我已经读过它不建议使用realloc或者当一个人可以简单地使用std :: vector时调整数组的大小但是我在将数组更改为向量时遇到了问题。
这是我目前的代码:
int main(){
// This is what I'm doing now
State*arr[3];
int pos = 0;
arr[0] = new Menu();
// How do I change it to a vector? This is what I'm trying:
std::vector<State> vec;
vec.push_back(Menu());
...
}
然而我不断收到错误:“无法分配抽象类型'对象'的对象”我做错了什么?
这些是类状态和菜单:
class State
{
public:
virtual ~State() {};
virtual void capture_events() = 0;
virtual void logic() = 0;
virtual void render() = 0;
};
Menu : public State
{
public:
Menu();
~Menu();
void capture_events();
void logic();
void render();
};
答案 0 :(得分:3)
您需要额外的间接,因为State
是一个多态基类。您可以使用std::unique_ptr
中的<memory>
来完成此操作。
#include <memory>
std::vector<std::unique_ptr<State>> states;
states.emplace_back(new Menu());
由于异常安全,使用std::unique_ptr<State>
而非State*
非常重要。请考虑以下事项:
std::vector<State*> states;
states.push_back(new Menu());
foo(); // what if foo throws an exception?
// the next line wouldn’t get executed!
for (auto ptr : states) delete ptr;
相反,std::unique_ptr
使用RAII来确保在向量超出范围时始终删除对象,即使在早期返回或异常的情况下也是如此。如需进一步参考,请参阅The Definitive C++ Book Guide and List。
答案 1 :(得分:0)
您无法实例化具有纯虚拟方法的类,即
之类的方法virtual void func() = 0;
=0
表示您必须派生类并在那里实现此方法。这个派生类可以实例化。
只要一个类包含纯虚方法,就无法实例化它,你就会得到错误。
答案 2 :(得分:-1)
如果使用矢量,则对象必须是默认可构造的。如果其中一个虚方法标记为= 0以设置类抽象,则无法构造类State的对象。拥有抽象类的想法是不能创建该类的对象。
你可能想做什么:
使用像State这样的抽象基础创建一个类族。创建指向类的实例(对象)的指针向量。使用new创建对象,并使用push_back指向向量的指针。如果删除某些元素,请不要忘记删除带删除的对象。
不要忘记让你家的破坏者也虚拟!
类似的东西:
class Base
{
virtual void Do() =0;
virtual ~Base();
};
class A: public Base
{
void Do() { ... }
}
class B ...
class C ...
// Create your vector somewhere...
vector<Base*> myVect;
void AddObject()
{
// It is not important which kind of object you create. Base* obj can "hold" every
// object which is build from a class which is derived from Base!
Base* obj=new A();
myVect.push_back(obj);
}
void DeleteObj( Base* obj )
{
myVect.erase( ...find the object...);
delete obj;
}
void PopBack()
{
Base* ptr = myVect.back(); // get last object pointer
delete ptr; // delete the object
myVect.pop_back(); // remove pointer to object from vector
}