gpt4 book ai didi

c++ - 类中派生信息的成员函数

转载 作者:太空狗 更新时间:2023-10-29 23:31:57 26 4
gpt4 key购买 nike

在为类设计接口(interface)时,我通常会陷入两种想法:是否应该提供可以通过使用其他成员函数的组合来计算/派生的成员函数。例如:

class DocContainer
{
public:
Doc* getDoc(int index) const;
bool isDocSelected(Doc*) const;
int getDocCount() const;

//Should this method be here???
//This method returns the selected documents in the contrainer (in selectedDocs_out)
void getSelectedDocs(std::vector<Doc*>& selectedDocs_out) const;
};

我应该将其提供为类成员函数还是可能是我可以定义该方法的 namespace ?首选哪一个?

最佳答案

一般来说,您应该更喜欢自由函数。从 OOP 的角度考虑。

如果函数不需要访问任何私有(private)成员,那么为什么要给予访问它们的权限?这不利于封装。这意味着当类的内部被修改时,更多的代码可能会失败。

它还限制了可能的代码重用量。

如果你把这个函数写成这样:

template <typename T>
bool getSelectedDocs(T& container, std::vector<Doc*>&);

然后 getSelectedDocs 的相同实现将适用于公开所需功能的任何类,而不仅仅是您的 DocContainer。

当然,如果您不喜欢模板,也可以使用接口(interface),然后它仍然适用于实现该接口(interface)的任何类。

另一方面,如果它是一个成员函数,那么它将只对这个特定的类(以及可能的派生类)起作用。

C++ 标准库遵循相同的方法。以 std::find 为例,正是出于这个原因,它成为了一个免费函数。它不需要知道它正在搜索的类的内部结构。它只需要一些实现它的要求。这意味着相同的 find() 实现可以在标准库或其他地方的任何容器上工作。

Scott Meyers 支持 same thing .

如果您不喜欢它弄乱您的主命名空间,您当然可以将它放入一个单独的命名空间中,该命名空间具有该特定类的功能。

关于c++ - 类中派生信息的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/503664/

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