如何在具有相同基类的两个不同类中获取向量

How do I get a vector to take in 2 different classes with the same base class?

本文关键字:两个 同类 向量 获取 基类      更新时间:2023-10-16

我知道在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);
  1. 删除= std::vector();没有必要
  2. 请将初始化代码A a; B b; std::....移到main函数中
  3. 你的for_each也错了
  4. 如果sizeof(BaseClass)为零,我不知道C++会做什么

我认为你隐藏了太多的代码:什么是GameScreens