我正在尝试将项目从c#转换为c ++,并且遇到了一些我不确定如何在c ++中实现的功能。
我有一个对象列表(或矢量),所有对象都转换为父类型。在c#中,我可以在不知道子节点的情况下从该列表中的对象调用函数,并且将调用相应的子函数,但是我不确定如何使这个特定功能在c ++中工作。
来自C#的代码段:
public void AddComponent(IComponent component)
{
Debug.Assert(component != null, "Component must not be null");
componentList.Add(component);
mask |= component.ComponentMask;
}
从Component检索ComponentMask枚举值并正确执行按位操作。
C ++的代码片段:
void oEntity::AddComponent(IComponent &componentIn)
{
componentList.push_back(componentIn);
mask |= componentIn.ComponentMask();
}
这将返回错误“IComponent无法实例化抽象类”,如果我从方法中删除括号,则运算符重载不再起作用并抛出错误“binary'| =':找不到右侧操作数的操作符类型'重载函数'(或没有可接受的转换)“
掩码值是一个枚举,它包含用作标识组件类型的标志的位移入的整数。运算符也已适当重载以使用枚举类型。
答案 0 :(得分:0)
OP已经解决了这个问题,所以这是其他任何人遇到这个问题的。
在C ++中,您可以声明virtual
方法(您也可以声明纯虚拟方法,但这有点复杂)。这些方法可以被子类覆盖,但也必须自己实现,或者你得到一些cryptic errors。
如果您希望它们默认不执行任何操作,最简单的解决方案是使用空体来定义它们。这是一个简单的例子:
class ParentClass
{
int x, y;
virtual void handleNewPos(int newX, int newY){}
public:
ParentClass(int x, int y)
{
resetPos(x, y);
}
void resetPos(int newX, int newY)
{
handleNewPos(newX, newY);
x = newX;
y = newY;
}
}
class ChildClass: public ParentClass
{
// marked 'override' because it's replacing a previous virtual method that had the same
// return type / params. Not required, but if you're using C++11 or greater, than it's
// preferred
virtual void handleNewPos(int newX, int newY) override
{
// Every time the resetPos method is called, it prints out it's new position.
std::cout << "New Position: " << newX << ", " << newY << std::endl;
}
public:
ChildClass(int x, int y): ParentClass(x, y) {}
}