我知道在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>>
发布于 2015-02-08 16:31:24
这里出了很多问题。第一:
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);
然后,也只有到那时,您的代码才会编译。那么,假设您为您的虚拟重写提供了定义--否则它将无法链接。
发布于 2015-02-08 16:33:40
是的,这是可行的。您需要更改您的向量以保存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);
发布于 2015-02-08 16:30:36
= std::vector();
没有必要A a; B b; std::....
移到main
函数中。for_each
也错了。sizeof(BaseClass)
会做什么。我认为你隐藏了太多的代码:什么是GameScreens
https://stackoverflow.com/questions/28401030
复制