我正在将这个c#代码重写为c ++:
foreach (var index in indexes)
{
if (index is MaWorker)
{
(index as MaWorker).needCalculate = true;
}
if (index is RocWorker)
{
(index as RocWorker).needCalculate = true;
}
}
什么是最好的c ++模拟?我应该使用什么而不是C#is
关键字?
答案 0 :(得分:6)
C ++ 11也有预测,并且自动类型推断。因此,假设您有一个现代编译器并启用了C ++ 11:
for (auto index : indexes)
{
if (auto w = dynamic_cast<MaWorker*>(index))
{
w->needCalculate = true;
}
if (auto w = dynamic_cast<RocWorker*>(index))
{
w->needCalculate = true;
}
}
请注意,您对每个指针使用is
和as
。它们都检查对象的动态类型,但您只需要检查一次。幸运的是,C ++具有条件声明的良好语法。
答案 1 :(得分:1)
最好的c ++模拟是使用std :: shared_ptr和std :: dynamic_pointer_cast。 这是因为在c#中,所有对象实际上都是引用计数句柄,而c ++中的模拟对象是shared_ptr。
这样:
class Worker {};
class MaWorker : public Worker {};
class RocWorker : public Worker {};
std::vector< std::shared_ptr< Workers > > indexes;
for (const auto& index : indexes) {
if (auto ma = std::dynamic_pointer_cast<MaWorker>(index)) {
ma->needCalculate = true;
}
if (auto roc = std::dynamic_pointer_cast<RocWorker>(index)) {
roc->needCalculate = true;
}
}
然而,这种类型的转换打破了OO原则。为什么不将needCalculate成员移动到基类中,或者更好地使用一些基类方法来通知对象您正在处理的任何外部事件?也许这超出了转换的范围。
注意。 c#对象引用与c ++指针不同。