需要相同递归函数的私有和公共方法
Posted
技术标签:
【中文标题】需要相同递归函数的私有和公共方法【英文标题】:Needing a private and public method for the same recursive function 【发布时间】:2015-08-22 07:08:24 【问题描述】:我们最近一直在为我的计算机科学课上的 C++ 中的几个类(树、堆、队列、链表等)实现递归方法。我在编写这些方法的实现时没有遇到任何问题,但是我的教授顺便提到的一些事情让我很困惑,她从未详细说明这一点。
她提到,在为类实现递归函数时,您需要同时拥有该函数的公共和私有版本。
例如(链表类定义的一部分):
public:
// constructors, destructors
// member functions etc.
findMax() findMax(head);
private:
findMax(Node* first_node) // actual code with recursive calls
Node* head;
所以这里有两个函数,一个是私有的,一个是公共的。公共函数所做的只是调用私有函数并返回它找到的任何答案。
我对此有几个问题。
这是你必须做的事情吗? 这是否仅适用于递归的类方法?如果是这样,那么递归函数如何使它成为必要?你会为其他功能这样做吗?
我的直觉是,这样做可能是为了确保使用公共类方法的人不会进入完全的 dingus 模式并最终调用带有不会导致停止/基本情况的参数的递归函数。
谁能概括地阐述这个想法并以直观的方式解释它?
谢谢!
编辑:谢谢大家的快速回答,他们非常有帮助!我想我可能听错了我的教授,这实际上与递归无关(尽管她写的例子可能是),而只是面向对象编程中的一个约定。
OOP 中的想法是 findMax() 需要使用私有类变量(head)才能使用,但这将是一个方便的公共函数。 findMax(Node* n) 的私有版本然后允许公共用户找到列表的最大值,而没有机会访问和弄乱私有头部。
谢谢大家!干杯。
【问题讨论】:
她提到在为一个类实现递归函数时,你需要该函数的公共和私有版本。:告诉她private
方法怎么样递归被命名为findMax_recursion()
会有什么不同吗?我的观点是,她所说的是个人指令,不一定是好的做法。
"她提到在为一个类实现递归函数时,您需要同时拥有该函数的公共和私有版本" - C++ 中没有这样的要求。也许这是她的要求,但这只是一种编码风格。
公共函数不是递归的。
【参考方案1】:
“我的直觉是,也许这样做是为了确保使用公共类方法的人不会进入完全的 dingus 模式并最终调用带有不会导致停止的参数的递归函数/基本情况。”
你的直觉在某种程度上是正确的。 head
由类在内部进行管理,不应作为调用者的参数引入。
与递归没有特定的相关性,而是数据封装 OOP 原则:
head
应该在内部由类管理,尽管函数 findMax()
应该在公共类接口中可用。为了提供适当的内部实现,搜索被委托给private
实现,在这种情况下递归使用。但这并不重要。
至于您对问题的修改。您应该将尽可能多的代码放入private
函数中,并使其保持狭窄。我看不出任何原因,为什么你的教授将这些放在公共功能中。
【讨论】:
我认为可能是这种情况,它与递归无关。您能从 OOP 的角度简要解释一下这样做的逻辑吗?我觉得好像我差不多明白她为什么这样做了,但我还没有完全理解。 非常感谢您,现在这更有意义了!我还有一个问题,如果您有时间,我将编辑成大部分问题。谢谢谢谢! @KurtMadland “我将编辑大部分问题” 请不要!请在此处一次提出一个问题。 抱歉,好吧,那没关系,谢谢您的帮助!【参考方案2】:这是你必须做的事情吗?
没有。
这只适用于递归的类方法吗?
甚至没有。
如果是这样,那么递归函数如何使这变得必要?
什么都没有。
你会为其他功能这样做吗?
是的,我愿意。这是您在组织代码方面做出的选择。一般来说,我的public
类成员函数调用的函数是private
,除非有任何内在需要它们也是public
。
她提到,在为类实现递归函数时,您需要同时拥有该函数的公共和私有版本。
假设这几乎是逐字逐句,你的老师要么错了,要么不清楚。 (也有可能她将“选择”的元素留给未来的课程;这是否符合道德/合理还有待商榷。)
也有人可能会争辩说,在这种情况下,她通过给两个 findMax
重载命名相同的名称来误导您; findMax()
和findMax(Head*)
是两个独立的函数,你可以(我会)调用后者findMaxImpl(Head*)
,或者类似的东西。然后你会看到递归和这个没有任何关系。
我的直觉是,这样做可能是为了确保使用公共类方法的人不会进入完全的 dingus 模式并最终调用带有不会导致停止/基本情况的参数的递归函数。
有趣的是,您的直觉在这里比 C++ 实际要明智得多。 :P 语言中没有任何东西可以防止甚至尝试来防止“完全 dingus 模式”。不是真的。
【讨论】:
@πάνταῥεῖ:“不是真的”?哇,这些天来获得 SO 代表太容易了! ;)以上是关于需要相同递归函数的私有和公共方法的主要内容,如果未能解决你的问题,请参考以下文章