xem xét như sau:Tôi có thể sử dụng boost :: make_shared với một hàm tạo riêng không?
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>();
};
};
Nó có vẻ như DirectoryIterator nên có thể gọi boost::make_shared<DirectoryIteratorImpl>
, bởi vì nó là một người bạn của DirectoryIteratorImpl
. Tuy nhiên, mã này không biên dịch được vì hàm tạo cho DirectoryIteratorImpl là riêng tư.
Vì lớp này là chi tiết triển khai nội bộ mà khách hàng của DirectoryIterator
không bao giờ nên chạm vào, sẽ rất tuyệt nếu tôi có thể giữ riêng hàm tạo.
Đây có phải là sự hiểu lầm cơ bản của tôi xung quanh make_shared
hoặc tôi có cần đánh dấu một số loại tăng giá như friend
để gọi điện để biên dịch không?
Bạn có chắc chắn cần shared_ptr cho con trỏ impl của mình không? boost :: scoped_ptr thường thích hợp hơn và làm cho mọi thứ trở nên đơn giản hơn nhiều. Shared_ptr thường sẽ chỉ được sử dụng trong trường hợp này nếu bạn muốn DirectoryIterator được sao chép và các bản sao nên chia sẻ một cá thể impl duy nhất. Trong mã bạn đăng, có vẻ như các bản sao chia sẻ một impl sẽ là một lỗi. Shared_ptr là khi nhiều con trỏ chia sẻ quyền sở hữu một cá thể. – Alan