如何在具有相同基类的两个不同类中获取向量
How do I get a vector to take in 2 different classes with the same base class?
我知道在C#中有一种方法可以让变量接受值,只要它们共享一个基类,但我被C++难住了。我想做的事情可能吗?
这就是我的代码:
class BaseClass
{
public:
virtual void Setup() = 0;
virtual void DisplayText() = 0;
};
class A: public BaseClass
{
public:
void Setup();
void DisplayText();
};
class B: public BaseClass
{
public:
void Setup();
void DisplayText();
};
//main.cpp
A a;
B b;
std::vector<BaseClass> vector = std::vector();
void main()
{
vector.push_back(a);
vector.push_back(b);
for_each (vector.begin(), vector.end(), vector.Setup());
return 0;
}
用我现在所拥有的,尽管当我尝试运行这个时,它会给我这个错误:
IntelliSense: no instance of overloaded function
"std::vector<_Ty,_Alloc>::push_back [with _Ty=BaseClass,,Alloc=std::allocator<BaseClass>]"
matches the argument list
argument types are: (A*)
object type is: std::vector<BaseClass, std::allocator<BaseClass>>
这里有很多错误。第一:
std::vector<BaseClass> vector = std::vector();
这是无效的语法,vector
不是一个类型,所以你不能像在右边那样创建一个类型。仅此而已:
std::vector<BaseClass> vector;
第二,这不是你所说的for_each
:
for_each (vector.begin(), vector.end(), vector.Setup());
vector
上没有Setup()
函数。如果有的话,那甚至不是你想打给的Setup
。您要使用的是std::mem_fun
:
for_each (vector.begin(), vector.end(), std::mem_fn(&BaseClass::Setup));
一旦我们到达那里,我们就会发现代码中的主要问题:您正在对所有对象进行切片!首先,我们尝试按值将抽象类存储在vector
中,这是不可能的。如果是的话,由于切片问题,它无论如何都不会达到你想要的效果。您需要做的是将vector
更改为存储指向BaseClass
的指针:
std::vector<BaseClass*> vector;
vector.push_back(&a);
vector.push_back(&b);
然后,也只有到那时,您的代码才会编译。假设你在某个地方提供了虚拟覆盖的定义,否则它就不会链接。
是的,这是可行的。您需要更改您的向量以容纳BaseClass*
指针。
std::vector<BaseClass*> vector;
vector.push_back(&a);
vector.push_back(&b);
void DoSetup(BaseClass *obj)
{
obj->Setup();
}
for_each (vector.begin(), vector.end(), DoSetup);
- 删除
= std::vector();
没有必要 - 请将初始化代码
A a; B b; std::....
移到main
函数中 - 你的
for_each
也错了 - 如果
sizeof(BaseClass)
为零,我不知道C++会做什么
我认为你隐藏了太多的代码:什么是GameScreens
?
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何设置一个 std::vector 与另一个,其中两个是不同类的向量?
- 从两个不同类继承的非虚拟基类的访问成员
- 使用转换运算符相互转换两个不同类的对象
- 两个不同类的运行时多态性
- 如何比较两个不同类的对象
- 具有两个不同类的两个不同构造函数
- 如何在具有相同基类的两个不同类中获取向量
- 两个不同类的泛型函数
- 检查来自不同类的两个Rect之间的冲突
- c++中包含两个不同类的对象的列表
- 比较来自两个不同类的对象
- c++ Boost信号连接模板中两个不同类的两个函数
- 等同c++中来自不同类的两个对象
- 重载指向两个不同类的指针的赋值运算符
- 如何锁定由属于两个不同类的两个线程修改的数据结构