considerar lo siguiente:¿Puedo usar boost :: make_shared con un constructor privado?
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>();
};
};
Parece que DirectoryIterator debe ser capaz de llamar a boost::make_shared<DirectoryIteratorImpl>
, porque es un amigo de DirectoryIteratorImpl
. Sin embargo, este código no se puede compilar porque el constructor de DirectoryIteratorImpl es privado.
Dado que esta clase es un detalle de implementación interna que los clientes de DirectoryIterator
nunca deberían tocar, sería bueno si pudiera mantener el constructor privado.
¿Este es mi malentendido fundamental alrededor de make_shared
o necesito marcar algún tipo de pieza de refuerzo como friend
para que la llamada compile?
¿Estás seguro de que necesitas shared_ptr para tu puntero impl? boost :: scoped_ptr es normalmente más apropiado y hace las cosas mucho más simples. Shared_ptr normalmente solo se usaría en este caso si quisiera que DirectoryIterator se pueda copiar y que las copias compartan una única instancia de impl. En el código que publicaste, parece que las copias que comparten un impl serían un error. Shared_ptr es para cuando varios punteros deben compartir la propiedad de una instancia. – Alan