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

标签 c++ oop

在为类设计接口(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/

相关文章:

c++ - 包括字符串或 string.h

c++ - 私有(private)/ protected /公共(public)如何影响 ABI?

oop - 无法从另一个实例变量的定义中访问实例变量 super

javascript - Douglas Crockford 的构造函数模式

java - 当我们有访问器和修改器时,为什么要声明私有(private)字段?

c++ - 将二维数组添加到一维数组

c++ - Windows 上的 OpenSSL 可以使用系统证书存储吗?

javascript - 在 QML 中访问 QList 对象

javascript - 在javascript中将值设置为__proto_ _` and `原型(prototype)

c++ - 静态方法初始化程序中的空 std::string