考虑以下几点:我可以使用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
的朋友。但是,此代码无法编译,因为DirectoryIteratorImpl的构造函数是私有的。
因为此类是一个内部实现细节的DirectoryIterator
客户不应该碰,这将是很好,如果我能保持构造私有。
这是我对make_shared
的基本误解,还是我需要标记某种提升块作为friend
以便调用编译?
你确定你需要shared_ptr的为您实现了一套指针? boost :: scoped_ptr通常更合适,使事情变得更简单。如果您希望DirectoryIterator是可复制的,并且副本应共享单个impl实例,则通常只会在此情况下使用Shared_ptr。在您发布的代码中,似乎共享impl的副本将是一个错误。 Shared_ptr用于多个指针应共享实例的所有权。 – Alan 2010-04-08 16:17:44