【发布时间】:2018-06-06 15:24:44
【问题描述】:
我正在尝试将一个项目从 c# 转换为 c++,并且遇到了一个我不确定如何在 c++ 中实现的功能。
我有一个对象列表(或向量),所有对象都转换为它们的父类型。在 c# 中,我可以在不知道子对象的情况下从此列表中的对象调用函数,并且将调用适当的子函数,但是我不确定如何使这个特定功能在 c++ 中工作。
来自 C# 的代码 sn-p:
public void AddComponent(IComponent component)
{
Debug.Assert(component != null, "Component must not be null");
componentList.Add(component);
mask |= component.ComponentMask;
}
从 Component 中检索 ComponentMask 枚举值并正确执行按位运算。
来自 C++ 的代码 sn-p:
void oEntity::AddComponent(IComponent &componentIn)
{
componentList.push_back(componentIn);
mask |= componentIn.ComponentMask();
}
这将返回错误“IComponent 无法实例化抽象类”,如果我从方法中删除括号,则运算符重载不再起作用并抛出错误“二进制'|=':未找到采用右手操作数的运算符'overloaded-function' 类型的(或没有可接受的转换)"
掩码值是一个包含位移位整数的枚举,用作标识组件类型的标志。运算符也被适当地重载以使用枚举类型。
【问题讨论】:
-
我有一个对象列表(或向量),所有对象都转换为它们的父类型。这是 C++ 中的一个问题。您的代码受到object slicing 的影响。请改用
std::vector<shared_ptr<IComponent*>>。 -
Get a couple of good C++ books 并开始阅读。对于这个问题特别感兴趣,请阅读 pointers、polymophism 和 virtual functions。
-
在 C++ 中,运行时多态性是基于指针的。您需要
IComponent*(或唯一/共享指针)类型的指针的向量/列表,然后存储指向继承类实例的指针。通过这些指针,你就可以调用ComponentMask等虚方法。 -
更正我之前的评论。请改用
std::vector<shared_ptr<IComponent>>。 -
感谢您的快速回复,他们非常有帮助,帮助我解决了问题,也让我在此过程中学到了一些东西。
标签: c++