Can I use boost::make_shared with a private constructor?(我可以将 boost::make_shared 与私有构造函数一起使用吗?)
问题描述
考虑以下事项:
class DirectoryIterator;
namespace detail {
class FileDataProxy;
class DirectoryIteratorImpl
{
friend class DirectoryIterator;
friend class FileDataProxy;
WIN32_FIND_DATAW currentData;
HANDLE hFind;
std::wstring root;
DirectoryIteratorImpl();
explicit DirectoryIteratorImpl(const std::wstring& pathSpec);
void increment();
bool equal(const DirectoryIteratorImpl& other) const;
public:
~DirectoryIteratorImpl() {};
};
class FileDataProxy //Serves as a proxy to the WIN32_FIND_DATA struture inside the iterator.
{
friend class DirectoryIterator;
boost::shared_ptr<DirectoryIteratorImpl> iteratorSource;
FileDataProxy(boost::shared_ptr<DirectoryIteratorImpl> parent) : iteratorSource(parent) {};
public:
std::wstring GetFolderPath() const {
return iteratorSource->root;
}
};
}
class DirectoryIterator : public boost::iterator_facade<DirectoryIterator, detail::FileDataProxy, std::input_iterator_tag>
{
friend class boost::iterator_core_access;
boost::shared_ptr<detail::DirectoryIteratorImpl> impl;
void increment() {
impl->increment();
};
bool equal(const DirectoryIterator& other) const {
return impl->equal(*other.impl);
};
detail::FileDataProxy dereference() const {
return detail::FileDataProxy(impl);
};
public:
DirectoryIterator() {
impl = boost::make_shared<detail::DirectoryIteratorImpl>();
};
};
看起来DirectoryIterator 应该可以调用boost::make_shared
,因为它是DirectoryIteratorImpl
的朋友.但是,此代码无法编译,因为 DirectoryIteratorImpl 的构造函数是私有的.
It seems like DirectoryIterator should be able to call boost::make_shared<DirectoryIteratorImpl>
, because it is a friend of DirectoryIteratorImpl
. However, this code fails to compile because the constructor for DirectoryIteratorImpl is private.
由于这个类是一个内部实现细节,DirectoryIterator
的客户端不应该接触,如果我能保持构造函数私有就太好了.
Since this class is an internal implementation detail that clients of DirectoryIterator
should never touch, it would be nice if I could keep the constructor private.
这是我对 make_shared
的基本误解,还是我需要将某种 boost 片段标记为 friend
以便调用编译?
Is this my fundamental misunderstanding around make_shared
or do I need to mark some sort of boost piece as friend
in order for the call to compile?
推荐答案
您确实需要为此添加一些增强件.基本上 make_shared
正在调用构造函数,并且这是从友元函数内完成的事实对编译器无关紧要.
You will indeed need to make some boost pieces friend for this. Basically make_shared
is calling the constructor and the fact that this is done from within a friend function does not matter for the compiler.
好消息是 make_shared
正在调用构造函数,而不是任何其他部分.所以只要让 make_shared
成为朋友就可以了……但这意味着任何人都可以创建一个 shared_ptr
...
The good news though is that make_shared
is calling the constructor, not any other piece. So just making make_shared
friend would work... However it means that anyone could then create a shared_ptr<DirectoryIteratorImpl>
...
这篇关于我可以将 boost::make_shared 与私有构造函数一起使用吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:我可以将 boost::make_shared 与私有构造函数一起使用吗?


- 如何对自定义类的向量使用std::find()? 2022-11-07
- 使用/clr 时出现 LNK2022 错误 2022-01-01
- C++ 协变模板 2021-01-01
- 一起使用 MPI 和 OpenCV 时出现分段错误 2022-01-01
- STL 中有 dereference_iterator 吗? 2022-01-01
- 静态初始化顺序失败 2022-01-01
- 从python回调到c++的选项 2022-11-16
- Stroustrup 的 Simple_window.h 2022-01-01
- 与 int by int 相比,为什么执行 float by float 矩阵乘法更快? 2021-01-01
- 近似搜索的工作原理 2021-01-01