如何包装PIMPL,隐藏原始指针

3
在Sean Parent的going native讲座中,他建议尽可能少地使用带有隐含所有权的指针。他表示,在00:53:06处轻松包装PIMPL实现是微不足道的。 https://channel9.msdn.com/Events/GoingNative/2013/Cpp-Seasoning 我不确定我理解他在这里的意思。我认为实现指针总是隐藏在使用它们的类中。是否还有其他更方便的PIMPL层次结构我没有注意到?
编辑: 早些时候,他说unique_ptrshared_ptr都算作原始指针。这就是我困惑的原因,我知道unique_ptrshared_ptr简化了资源处理,但我不知道有任何方法可以进一步隐藏它们。

1
你可以将其隐藏在类的实现中,并通过使用类似于unique_ptr的东西来避免编写3|5组。 - undefined
2个回答

1

是的。使用unique_ptr。使用pimpl习惯的类“拥有”原始指针,尽可能少地拥有原始指针是良好的实践。

class T {
public:
    T() : impl{} {};
private:
    struct impl;
    std::unique_ptr<impl> pImpl_;
}

impl是一个不完整的类型,所以unique_ptr<impl>会报错。添加一个删除器:struct impl_deleter { void operator()(impl*); };然后使用std::unique_ptr<impl, impl_deleter> pImpl_;t.cpp文件可以实现void T::impl_deleter::operator()(impl* ptr) { delete ptr; }; - undefined

0

你可以使用独占指针。由于你可以使用不完整类型创建独占指针,所以这是最好的选择。但是,你不应该忘记添加析构函数,因为类型是不完整的。如果你没有添加析构函数,编译器将会创建一个默认的析构函数,并要求完整定义不完整的类型。由于在此阶段这是不可能的,你将会得到一个编译错误。下面是使用独占指针实现pimpl的示例。

// Foo.h
class Foo {
    public:
        Foo();
        ~Foo();

        void implementationToHide();
    private:
        class FooImpl;
        std::unique_ptr<FooImpl> _impl;
};

实现细节

// Foo.cpp
class Foo::FooImpl {
    public:
        void actualImplementation(const Foo &f);
};

void Foo::FooImpl::actualImplementation(const Foo &f) {
    // some secret implementation
}

Foo::Foo(): _impl(std::make_unique<Foo::FooImpl>()) 
{

}

Foo::~Foo() {
    
}

void Foo::implementationToHide() {
    _impl->actualImplementation(*this);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接