金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  406 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
把private声明从.h文件移到.cpp文件

(转载请注明来源于金庆的专栏)

在*.h文件中定义一个类时,理论上应该仅定义其公共接口,而不必声明其私有的成员,因为私有的成员属于实现部分,理应声明在.cpp文件中。

可是现有的C++标准是不支持将一个类的定义分到两个文件中去的。

有一个pimpl模式,可以变相完成这个要求,只暴露公共接口,而实现定义为私有。pimpl 即 private implemention 的缩写。不光封装性好,还可以减少头文件依赖,提高编译速度。

例如:(来自:关于handle-body的用法及loki::PimplT的分析

/*.h*/
class CTest
{
public:
    void Test();
private:
    Loki::PimplT::Type m_impl;
};

/*.cpp*/
template<>
struct Loki::ImplT
{
public:
    void Test() { std::cout << "test" << std::endl; }
};

void CTest::Test() { return m_impl->Test(); }
posted on 2007-11-09 12:07 金庆 阅读(1705) 评论(13)  编辑 收藏 引用 所属分类: 1. C/C++

评论

# re: 把private声明从.h文件移到.cpp文件[未登录] 2007-11-09 12:36 梦在天涯
就是隐藏实现的方法,我以前也看过,还有一种方法抽象类!

我的blog的C++基础里有!  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件[未登录] 2007-11-09 12:46 hdqqq
如果隐藏私有的数据成员,会不会造成实现代码中sizeof(class) 和使用该类时sizeof(class) 大小不同, 导致数据出错.
  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-11-09 12:46 mm
这样折腾其实很麻烦
如果没什么特别的需求的话,一般不会用这个  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-11-09 13:07 lovedday
这种做法比直接将声明放在private更糟糕,简单问题复杂话,如果确实需要仅提供接口,搞个纯虚基类不就可以呢?  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-11-09 13:08 lovedday
c++折腾到这种份上,完全本末倒置。  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-11-09 15:23 teli
干嘛搞得这么复杂,晕,自己给自己找事做  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-11-09 15:49 万连文
接口,用接口编程最直接。  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-11-09 15:51 lovekatherine
Effective C++的Item 31对这点讲得挺清楚的  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-11-12 13:40 congcong
这破坏了C++的封装性 程序还更加复杂`  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-11-13 10:03 金庆
我是想这样定义类,将公有接口与私有实现分开,但是C++不允许:

// .h ------------------
class CTest
{
public:
void Foo();
int Bar();
// ...
// private part is in .cpp file.
}

// .cpp -----------------
class CTest
{
// public interface part is in .h file.
private:
int m_nCount;
// ...
}

  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-11-13 11:02 mm
可能你有点太过于OO了
事实上,我公司的下个项目,打算将C++当成C+类来使用,全员public,私有函数完全放在cpp文件下,成员变量只读。  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-12-12 14:36 Fox
private:
Loki::PimplT::Type m_impl;
这个m_impl不是声明吗?

哥们儿给我一个private data member声明在cpp的实现我看看。  回复  更多评论
  

# re: 把private声明从.h文件移到.cpp文件 2007-12-12 15:57 Fox
除非在工程上有足够的证据证明类似封装比直接声明高效和必需,否则还是很少人愿意这样做  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理