如何为 .cpp 文件中定义的所有类成员方法声明范围? [复制]

Posted

技术标签:

【中文标题】如何为 .cpp 文件中定义的所有类成员方法声明范围? [复制]【英文标题】:How to declare a scope for all class member methods defined in a .cpp file? [duplicate] 【发布时间】:2020-01-10 11:02:13 【问题描述】:

有没有一种方便的方法来减少这种情况下的代码冗余?:

//Queue.h
template <class T>
class Queue 
public:
 Queue();
 ~Queue();


//Queue.cpp
template <class T> Queue<T>::Queue()  ... 
template <class T> Queue<T>::~Queue()  ... 

除了,可能,

//Queue.cpp
#define QUEUE template <class T> Queue<T>::
QUEUE Queue()  ... 
QUEUE ~Queue()  ... 

我知道您可以在头文件/类声明中定义成员函数,但如果可能的话,我认为应该避免这样做?

【问题讨论】:

与Is it possible to avoid repeating the class name in the implementation file? 重复 - 捷径是研究namespace class 的C++ 标准提案 请注意,对于模板,无论如何您都不能将方法的声明和定义拆分为单独的文件:Why can templates only be implemented in the header file? @Yksisarvinen 不,你绝对可以,如果你事先知道你需要哪些特化,并在定义其中的成员函数后故意在实现源文件中实例化它们。 【参考方案1】:

简短的回答是否定的。

您可以期待 C++ 20 的“C++ 模块”。

但是由于您使用的是模板:为了避免链接器问题(以及许多其他原因),模板函数的定义通常内联在 .h 文件本身中

template <class T>
class Queue 
public:
 Queue() 
    ...
 
 ~Queue() 
     ...
 
 void Append(const T& t) 
    ...
 
;

然后您不需要 .cpp 文件,更不用说完全限定的函数名了。

【讨论】:

【参考方案2】:

没有

我知道您可以在头文件/类声明中定义成员函数,但如果可能的话,我认为应该避免这样做?

您需要确保所有成员的定义对实例化模板的任何地方都是可见的,这通常意味着它们在标题中。

【讨论】:

哦,我的错,我的意思是“定义”就像“在声明它的地方写函数的内容”,而不仅仅是声明它...```class Queue Queue() / * 做这个做那个 */ ``` 应​​该避免吗? @djohoe28 偏爱一种或另一种方式是一个风格问题。如果您的团队习惯于不合时宜的定义,最好保留长名称 template &lt;class T&gt; Queue&lt;T&gt;:: 行外定义也意味着更少的缩进和更容易重构到单独的文件(是一个包含显式实例化的实现文件,或者只是拆分成多个头文件)等。

以上是关于如何为 .cpp 文件中定义的所有类成员方法声明范围? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何为 ASP.NET MVC 2 创建自定义成员资格提供程序?

mfc怎么设置全局变量

如何在 cpp 文件中为多种类型创建模板类成员实现

模板类 error LNK2019: 无法解析的外部符号

作为类成员的函数的定义

如何为as2中的方法定义默认参数值?