C++:class 的前向声明,带有可重复的唯一指针的删除器
C++: Forward declaration of a class with a deleter for a unique pointer that can be repeated
在 C++ 中,可以使用前向声明来允许指向不完整类型的指针。
class A;
A *p;
然而,在某些情况下我想声明一个唯一的指针,所以我使用
class A;
class A_Deleter { void operator()(A*); }
unique_ptr<A, A_Deleter> p;
这在很多情况下都足够了,但有一个主要缺点。与真正的前向声明不同,它不能写两次。 IE。当此代码编译时:
class A;
class A;
这个没有:
class A;
class A_Deleter { void operator()(A*); }
class A;
class A_Deleter { void operator()(A*); }
你如何转发声明一个可删除的class?
为什么要重复?
将声明放在 header 中(使用适当的 include guards)并在需要的地方包含它。
你可以做的是专门为前向声明创建一个header,它也声明了删除器。给 header 通常的警卫,并包括 header 而不是 forward-declaring A
.
但总的来说,我会走另一条路。如果我只需要声明唯一指针,我会 forward-declare 并做 unique_ptr<A>
。如果我真的有一个唯一指针被销毁的上下文,我会获取 A
.
的完整定义
我想我找到了解决办法。
我定义了一个 class 通过 header 对所有人可见:
template <class T> class deleter { void operator()(T *x); };
然后我就可以摆脱声明删除器的需要 class 并且可以这样写:
class A;
unique_ptr<A, deleter<A> > p;
每个 T
的 deleter<T>::operator()
可以在其自己的 .cpp
文件中使用专门化来实现。
在 C++ 中,可以使用前向声明来允许指向不完整类型的指针。
class A;
A *p;
然而,在某些情况下我想声明一个唯一的指针,所以我使用
class A;
class A_Deleter { void operator()(A*); }
unique_ptr<A, A_Deleter> p;
这在很多情况下都足够了,但有一个主要缺点。与真正的前向声明不同,它不能写两次。 IE。当此代码编译时:
class A;
class A;
这个没有:
class A;
class A_Deleter { void operator()(A*); }
class A;
class A_Deleter { void operator()(A*); }
你如何转发声明一个可删除的class?
为什么要重复?
将声明放在 header 中(使用适当的 include guards)并在需要的地方包含它。
你可以做的是专门为前向声明创建一个header,它也声明了删除器。给 header 通常的警卫,并包括 header 而不是 forward-declaring A
.
但总的来说,我会走另一条路。如果我只需要声明唯一指针,我会 forward-declare 并做 unique_ptr<A>
。如果我真的有一个唯一指针被销毁的上下文,我会获取 A
.
我想我找到了解决办法。
我定义了一个 class 通过 header 对所有人可见:
template <class T> class deleter { void operator()(T *x); };
然后我就可以摆脱声明删除器的需要 class 并且可以这样写:
class A;
unique_ptr<A, deleter<A> > p;
每个 T
的 deleter<T>::operator()
可以在其自己的 .cpp
文件中使用专门化来实现。