我如何获得一个向量以接受具有相同基数 class 的 2 个不同的 classes?
How do I get a vector to take in 2 different classes with the same base class?
我知道在 C# 中有一种方法可以让变量接受值,只要它们共享一个基 class,但我对 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();
没必要
- 请将初始化代码
A a; B b; std::....
移动到 main
函数中。
- 你的
for_each
也是错误的。
- 如果
sizeof(BaseClass)
为零,我不知道 C++ 会做什么。
我认为您隐藏了太多代码:什么是 GameScreens
?
这里有很多错误。第一:
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));
到达那里后,我们就会遇到您代码中的主要问题:您是 slicing 所有对象!好吧,首先,我们试图按值将抽象 类 存储在 vector
中,这是不可能的。如果是这样,由于切片问题,它无论如何都不会做你想做的事。您需要做的是更改 vector
以存储指向 BaseClass
的指针:
std::vector<BaseClass*> vector;
vector.push_back(&a);
vector.push_back(&b);
然后,也只有那时,您的代码才能编译。好吧,假设您在某处为您的虚拟覆盖提供定义 - 否则它不会 link。
是的,这是可行的。您需要更改向量以容纳 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);
我知道在 C# 中有一种方法可以让变量接受值,只要它们共享一个基 class,但我对 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();
没必要 - 请将初始化代码
A a; B b; std::....
移动到main
函数中。 - 你的
for_each
也是错误的。 - 如果
sizeof(BaseClass)
为零,我不知道 C++ 会做什么。
我认为您隐藏了太多代码:什么是 GameScreens
?
这里有很多错误。第一:
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));
到达那里后,我们就会遇到您代码中的主要问题:您是 slicing 所有对象!好吧,首先,我们试图按值将抽象 类 存储在 vector
中,这是不可能的。如果是这样,由于切片问题,它无论如何都不会做你想做的事。您需要做的是更改 vector
以存储指向 BaseClass
的指针:
std::vector<BaseClass*> vector;
vector.push_back(&a);
vector.push_back(&b);
然后,也只有那时,您的代码才能编译。好吧,假设您在某处为您的虚拟覆盖提供定义 - 否则它不会 link。
是的,这是可行的。您需要更改向量以容纳 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);