如何为 .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 <class T> Queue<T>::
行外定义也意味着更少的缩进和更容易重构到单独的文件(是一个包含显式实例化的实现文件,或者只是拆分成多个头文件)等。以上是关于如何为 .cpp 文件中定义的所有类成员方法声明范围? [复制]的主要内容,如果未能解决你的问题,请参考以下文章