pimpl 和在 .cpp 文件中定义 class 之间的区别
Difference between pimpl and defining class inside .cpp file
我试图了解 pimpl 和在 .cpp 文件中定义之间的区别
// 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 隐藏了,甚至他也不知道真正工作的内部 class 的名称。
如果你向 foo
添加一个字段,那么在第二种情况下它必须在 header 中定义(以及字段的类型),但在第一种情况下(pimpl idiom ) 您可以改为在 impl
中定义字段,它的实例将与 foo
的实例一样长。
我试图了解 pimpl 和在 .cpp 文件中定义之间的区别
// 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 隐藏了,甚至他也不知道真正工作的内部 class 的名称。
如果你向 foo
添加一个字段,那么在第二种情况下它必须在 header 中定义(以及字段的类型),但在第一种情况下(pimpl idiom ) 您可以改为在 impl
中定义字段,它的实例将与 foo
的实例一样长。