创建子类的向量
Create a vector of sub classes?
我一直在使用动态数组,但我不得不添加和删除项目。我已经读过,当可以简单地使用 std::vector 时,不建议使用 realloc 或调整数组大小,但是我在将数组更改为矢量时遇到问题。
这是我当前的代码:
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();
};
您需要额外的间接寻址State
因为它是一个多态基类。您可以使用 <memory>
中的std::unique_ptr
执行此操作。
#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 来确保在向量超出范围时始终删除对象,即使在早期返回或异常的情况下也是如此。有关进一步参考,请参阅权威C++书籍指南和列表。
你不能实例化具有纯虚方法的类,即像
virtual void func() = 0;
=0
意味着您必须派生类并在那里实现此方法。可以实例化此派生类。
只要一个类包含纯虚拟方法,你就不能实例化它,你就会得到你的错误。
如果使用向量,则对象必须是默认可构造的。如果其中一个虚拟方法标记为 =0 以设置类抽象,则无法构造类状态的对象。拥有一个抽象类的想法是你不能创建该类的对象。
您可能想做什么:
创建一个具有抽象基础的类族,如您的状态。创建指向类的实例(对象(的指针向量。使用 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
}
相关文章:
- C++ 将子类的对象添加到父类的向量中
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何访问基类向量中的子类变量?(对于实体组件系统)
- 从父类的向量访问子类函数,而无需向下转换
- 如何识别从不同子类覆盖的向量类?
- C++11 向量包含 2 个不同的子类,但不能同时进行
- 带有基类指针的强制转换向量,指向子类
- C++ 子类无法访问其他子类向量
- 将子类添加到基类向量C++不起作用
- 如何将子类向量传递给需要基类向量的函数
- 制作可以存储子类对象的超类类型的向量
- <T2> <T1>当 T2 是 C++ 中 T1 的子类时,如何使用向量代替向量?
- 将子类添加到基类向量
- 将子类存储在超类向量中
- 创建子类的向量
- 制作不同子类实例的向量
- 模板向量 ->使用子类的成员
- C++中boost向量的子类
- 如何迭代定义为超类的向量,但调用子类方法
- 用简单的操作转换子类向量时得到错误