使列表中的子对象自我转换为同一父对象的其他子对象的最佳方法

Posted

技术标签:

【中文标题】使列表中的子对象自我转换为同一父对象的其他子对象的最佳方法【英文标题】:Best way to make a child object from a list self convert into other child of same parent 【发布时间】:2016-02-14 07:13:58 【问题描述】:

我有一个指向父对象的指针列表

vector<Parent*> list;

然后我有 2 个父类的子类:Child1 和 Child2 添加到列表中。

代码遍历列表的所有实体并调用Execute();

for(int i = 0; i < list.size(); i++)
    list[i]->Execute();

Execute() 是 Parent 的虚函数,在每个子类中的实现方式不同。我想在 Child1::Execute() 的函数中创建一个条件,将其替换为列表中相同位置的 Child2 实体。 p>

我当然不能这样做:

void Child1::Execute() 
    ...
    if(condition)
        this = new Child2();
    

但我想不出一个好的解决方案来做到这一点。最终会有几百个来自 Parent 的 Other Child 类会在其他条件下做同样的事情,所以我想要一个很好的可扩展解决方案。

谢谢

【问题讨论】:

您能否发布代码的完整示例...即使它无法编译。很难准确理解你在问什么。此外,您可能在谈论派生类而不是子类? 感谢您的回复。根据我的理解和this wikibook,一个子类一个从另一个派生的类。 【参考方案1】:

通常你不能用另一个对象替换当前对象。您必须将此操作移到 Execute 之外。

对于指针向量:

Parent* Child1::Execute() 
    ...
    return condition ? new Child2 : this;


newobj = list[i]->Execute();
if (newobj != list[i]) 
  delete list[i];
  list[i] = newobj;

对于合适的 smart 指针向量,它更简洁一点:

list[i] = list[i]->Execute();

【讨论】:

这正是我要找的!谢谢!

以上是关于使列表中的子对象自我转换为同一父对象的其他子对象的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

qt全局对象删除

不能将:not()用作父对象,以将CSS中的子对象作为目标对象

使 UIButtons 成为另一个对象的子对象

C#合并来自父级对象列表的子对象列表

C++ 在不知道子类型的情况下从父类型调用子方法

根据键中的子字符串将对象转换为对象数组