C++ 代码重复,但不同的类是新的

C++ 代码重复,但不同的类是新的,c++,constructor,code-duplication,C++,Constructor,Code Duplication,如何消除Vistuper、VisitOwner、VisitTX中的代码重复。。。功能?它们唯一不同的是创建了新的WhateverAction(参数) 我可以使startVisit和endVisit功能,这将减少复制的长度,但复制仍将存在。。。我希望有一个更优雅的方法来做这个 virtual void visitUpper(const Potion& potion) { // leave if unavailable action for various r

如何消除Vistuper、VisitOwner、VisitTX中的代码重复。。。功能?它们唯一不同的是创建了新的WhateverAction(参数)

我可以使startVisit和endVisit功能,这将减少复制的长度,但复制仍将存在。。。我希望有一个更优雅的方法来做这个

    virtual void visitUpper(const Potion& potion)
    {
        // leave if unavailable action for various reasons
        // and a few more things...
        PotionAction* action = new UpperAction(potion);
        actions.push_back(action);
        // add to our button list
    }
    virtual void visitDowner(const Potion& potion)
    {
        // leave if unavailable action for various reasons
        // and a few more things...
        PotionAction* action = new DownerAction(potion);
        actions.push_back(action);
        // add to our button list
    }
    //    ... and some more visitX which are identical except new XAction ...
    void actOn(int actionIndex)
    {
        actions[actionIndex]->prepareDrink();
    }

也许是这样的:

virtual void visitUpper(const Potion& potion)
{
    CommonCode(new UpperAction(potion));
}
virtual void visitDowner(const Potion& potion)
{
    CommonCode(new DownerAction(potion));
}

你可以在课堂上尝试以下方法:

private:
    template<typename T>
    void visit(const Potion& potion)
    {
        // leave if unavailable action for various reasons
        // and a few more things...
        PotionAction* action = new T(potion);
        actions.push_back(action);
        // add to our button list
    }

 public:

    virtual void visitUpper(const Potion& potion)
    {
        visit<UpperAction>(potion);
    }
    virtual void visitDowner(const Potion& potion)
    {
        visit<DownerAction>(potion);
    }
    // more visitXXX ...
private:
模板
无效访问(const药剂和药剂)
{
//如果由于各种原因无法采取行动,请离开
//还有一些事情。。。
药剂作用*作用=新T(药剂);
动作。推回(动作);
//添加到我们的按钮列表中
}
公众:
虚拟无效访问者(常量药剂和药剂)
{
参观(药水);
}
虚拟虚空访问所有者(常量药剂和药剂)
{
参观(药水);
}
//更多访问XXX。。。

制作
visitXXX
一个模板函数,并使用
visit(potion)
visit(potion)
等。可能会有所帮助?这就是我最终使用的方法,因为我并不总是需要在创建对象后立即更新对象并在某些情况下删除它,这似乎是不必要的。谢谢@没有创造性,乐于帮助;)