考虑以下两种实现pimpl成语的方法:
// file g_visible.h
//global forward declarations
class HiddenStuff_A;
class HiddenStuff_B;
class g_visible
{
public:
// API goodies for the end-user
private:
std::unique_ptr< HiddenStuff_A > hs_a;
std::unique_ptr< HiddenStuff_B > hs_b;
}和
// file p_visible.h
class p_visible
{
public:
// API goodies for the end-user
private:
// private forward declarations
class HiddenStuff_A;
class HiddenStuff_B;
std::unique_ptr< HiddenStuff_A > hs_a;
std::unique_ptr< HiddenStuff_B > hs_b;
}问题:用于最终用户--即对于包含gp_visible.h文件之一的开发人员--包含g_visible.h或p_visible.h有什么区别?
发布于 2014-11-20 04:46:16
区别在于,它们在全局范围内有两个“隐藏”类的前向声明(或者如果您的代码将g_visible放置在名称空间中,那么无论名称空间是什么)。
不必要的名称空间污染。实际后果:
Impl类使用pImplHiddenStuff_A*或HiddenStuff_A*定义的变量或函数参数,但实际上不能让变量指向或调用简而言之,没有Impl声明private是一个糟糕的选择。
https://stackoverflow.com/questions/27031713
复制相似问题