我必须在类的头文件中提及私有方法吗?

Posted

技术标签:

【中文标题】我必须在类的头文件中提及私有方法吗?【英文标题】:Do I have to mention private methods in the header file of a class? 【发布时间】:2013-04-06 09:25:23 【问题描述】:

现在我根本不使用头文件。每个类都完全位于一个 .cpp 文件中。但是为了节省编译时间,我现在想使用头文件。我希望 Visual Studio 不会编译那些没有为调试构建而修改的类。

有没有办法在头文件中只提及公共方法和成员。从理论上讲,这对于编译器来说已经足够了。如果另一个文件,比如main.cpp 包含类头,则不需要私有方法和成员,是吗?

如何在不重新键入私有方法和成员名称的情况下使用头文件?我想要的原因是编码效率。当我想为另一个方法使用的类添加一个小帮助函数时,我不想将它的签名也添加到头文件中。

【问题讨论】:

【参考方案1】:

如果另一个文件,比如 main.cpp 包含类头,就不需要私有方法和成员,是吗?

不,public 方法和成员不一定足够。例如,如果另一个 .cpp 文件尝试创建您的类的实例:

SomeClass instance;

除其他事项外,编译器需要知道为SomeClass 分配多少内存。为此,它需要充分了解SomeClass 的私有数据成员。

您提出问题的方式听起来好像您打算与语言作斗争。我认为这不是一个好方法。我认为最好的方法是按照通常用你选择的语言做事的方式来做事,并且只有在有特定的、明确理解的需求时才离开。

在 C++ 中通常做的事情是 整个 类声明放在头文件中,并且定义以某种方式在头文件和相应的.cpp 文件之间拆分。确切的拆分取决于各种技术考虑。例如,模板和内联函数通常必须出现在头文件中。另一方面,将代码放在头文件中会增加依赖关系并可能增加构建时间。

有一些方法可以解决这些问题。但是,由于这涉及额外的复杂性,我认为只有在有明确可识别的需求时才应该这样做。

【讨论】:

【参考方案2】:

我不知道有什么方法可以满足您的要求,但是还有另一种方法可以提供一些隔离。你可能想看看pimpl idiom,因为它提供了关于私人信息的隔离。这是一些额外的工作,但它可能非常有用,尤其是在大型项目中。

【讨论】:

【参考方案3】:

所有函数声明都应该放在头文件中,所有函数定义应该放在cpp文件中。将声明放在 cpp 文件中并不是一种好的编码习惯。

但是,当您编写模板或内联函数时,您可以将定义放在标题中。

在头文件中声明类后,您必须在头文件中的类声明中声明其所有方法和成员,因为您的类不再在 cpp 文件中声明 .

【讨论】:

以上是关于我必须在类的头文件中提及私有方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

编写OC高质量的代码的有效方法

编写OC高质量的代码的有效方法

Friend函数访问静态库中定义的类的私有成员

在类的头文件里尽量少引入其它头文件 <<Effective Objective-C>>

OC中在.h和.m中声明的属性和成员变量有何区别

正确包含标题