gpt4 book ai didi

c++ - 如何处理 "super"调用和递归

转载 作者:可可西里 更新时间:2023-11-01 16:21:05 33 4
gpt4 key购买 nike

我的问题是关于合并 2 种技术:

  • 递归调用 super 函数
  • 递归调用同一个函数

假设一个根类有一个递归函数(foo),一个扩展类重写这个函数(foo):重写函数必须调用super::foo,但需要在递归调用之前执行其他操作。

我会尝试一个例子(这只是一个例子,我知道有非递归的方法可以解决这个问题)

class Node
{
public:
// must be override
virtual int getNumValues()
{
if (parent) return parent->getNumValues() + 3;
else return 3;
}
protected:
Node *parent;
private:
int values[3];
};

class ExtNode: Node
{
public:
//@override
virtual int getNumValues()
{
int aux = Node::getNumValues(); //but need to avoid recursion here.
if (parent) return parent->getNumValues() + aux + 2;
else return aux + 2;
}
private:
int extValues[2];
};

所以我会的是:

  • 我可能会更改两个类:Node 和 ExtNode。
  • 我不会将代码从第一个类方法复制到第二个类方法以避免 Super 调用(类链可能很长)
  • 递归调用应该由子类完成

我正在尝试一些想法,但它们似乎是糟糕的编程实践或不可能:

// In Node class
...
virtual int getNumValues()
{
if (parent && !isNodeObject(this)) return parent->getNumValues()+3;
else return 3;
}
bool isNodeObject( Node *ob)
{
//return if ob is instance of Node (and not an extended class). How?
}

我也尝试过使用可选参数:

// In Node class
...
virtual int getNumValues( bool recursion = true)
{
if (parent && recursion) return parent->getNumValues()+3;
else return 3;
}

// In ExtNode class
...
virtual int getNumValues( bool recursion = true)
{
int aux = Node::getNumValues(false );
if (parent && recursion) return parent->getNumValues() + aux + 2;
else return aux + 2;
}

什么是最好的编程实践?

编辑 1:我试图解决的真正问题的解释(来自 Joachim Pileborg)

我正在创建一个用户界面库,即一组类和函数来轻松创建框架、按钮、输入文本等小部件。

我已经创建了一个具有大多数通用功能的基本(根类)小部件,一个“可见”小部件来为具有可见部分的小部件实现所有通用功能,等等。

还有一些容器,如框架、布局和窗口。

现在是困难的部分:有一个函数“updateStyle”应该立即更新小部件的所有图形部分(并重绘它):这个函数递归调用父类(super class)以执行更通用的功能,并且还必须递归调用容器以传播更改(小部件的尺寸和位置可能会更改)

enter image description here

每个小部件都应该“像这样”工作并且可以扩展,这就是这些要求的原因。

代码很长(大约 8k 行)并且有很多其他功能,所以没有必要复制到这里代码。

最佳答案

看起来您正在搜索模板方法模式:

  • 在基类中,实现概述函数一般行为的非虚拟方法。
  • 定义(抽象)虚方法,在该函数内定义特殊行为部分
  • 在派生类中,覆盖特殊行为

    class Node
    {
    public:
    int getAllNumValues()
    {
    int allNumValues = getNumValues();

    if (parent) allNumValues += parent->getAllNumValues();

    return allNumValues;
    }

    protected:
    virtual int getNumValues() {
    return 3;
    };
    private:
    Node *parent;
    int values[3];
    };

    class ExtNode: Node
    {
    protected:
    //@override
    virtual int getNumValues()
    {
    return 2 + Node::getNumValues(); //but need to avoid recursion here.
    }
    private:
    int extValues[2];
    };

如果你有更新功能,我建议有一个模板方法 update 来递归更新你的复合模式,另一个方法 updateThis 做更新只有一个对象。

关于c++ - 如何处理 "super"调用和递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24910454/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com