如何使用相同的基类获取2个不同类的向量?

时间:2015-02-09 00:20:45

标签: c++ inheritance vector

我知道在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>>

3 个答案:

答案 0 :(得分:7)

这里有很多错误。第一:

std::vector<BaseClass> vector = std::vector();

该语法无效,vector不是一种类型,因此您无法像在右侧那样创建一个类型。这就足够了:

std::vector<BaseClass> vector;

其次,这不是您致电for_each的方式:

for_each (vector.begin(), vector.end(), vector.Setup());

Setup()上没有vector功能。如果有,那甚至不是你要打的Setup。您要使用的是std::mem_fun

for_each (vector.begin(), vector.end(), std::mem_fn(&BaseClass::Setup));

一旦我们到达那里,我们就会遇到代码中的主要问题:您已经slicing了所有对象!好吧,首先,我们尝试按值vector存储抽象类,这是不可能的。如果是的话,由于切片问题,它无论如何都不会做你想要的。您需要做的是将vector更改为存储指向BaseClass的指针:

std::vector<BaseClass*> vector;
vector.push_back(&a);
vector.push_back(&b);

然后,只有这样,您的代码才会编译。好吧,假设您在某处提供了虚拟覆盖的定义 - 否则它不会链接。

答案 1 :(得分:4)

是的,这是可行的。您需要更改矢量以保留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);

答案 2 :(得分:0)

  1. 删除= std::vector();没有必要
  2. 请将初始化代码A a; B b; std::....移至main函数。
  3. 您的for_each也是错的。
  4. 如果sizeof(BaseClass)为零,我不知道C ++会做什么。
  5. 我认为您隐藏了太多代码:GameScreens是什么?