pimpl和定义类别的.cpp文件之间的区别

Difference between pimpl and defining class inside .cpp file

本文关键字:cpp 文件 之间 区别 定义 pimpl      更新时间:2023-10-16

im试图理解pimpl和在.cpp file

内定义之间的差异
// foo.h - header file
#include <memory>
class foo
{
public:
    foo();
    ~foo();
    foo(foo&&);
    foo& operator=(foo&&);
private:
    class impl;
    std::unique_ptr<impl> pimpl;
};
// foo.cpp - implementation file
class foo::impl
{
public:
    void do_internal_work()
    {
        internal_data = 5;
    }
private:
    int internal_data = 0;
};
foo::foo()
    : pimpl{ std::make_unique<impl>() }
{
    pimpl->do_internal_work();
}
foo::~foo() = default;
foo::foo(foo&&) = default;
foo& foo::operator=(foo&&) = default;

// foo.h - header file
#include <memory>
class foo
{
public:
    foo();
    ~foo();
    foo(foo&&);
    foo& operator=(foo&&);
};
// foo.cpp - implementation file
class impl
{
public:
    void do_internal_work()
    {
        internal_data = 5;
    }
private:
    int internal_data = 0;
};
foo::foo()
{
    impl _impl;
    _impl.do_internal_work();
}
foo::~foo() = default;
foo::foo(foo&&) = default;
foo& foo::operator=(foo&&) = default;

我认为使用PIMPL没有好处,因为实现已经从CPP文件中隐藏在Viever中,甚至他也不知道具有实际工作的内部班级名称。

如果将字段添加到foo,则在第二种情况下必须在标题(以及字段的类型(中定义,但在第一个情况下(PIMPL IDIOM(您可以代替impl中定义字段,并且它的实例将与foo的实例一样长。