class ClxTest { public: ClxTest(); virtual ~ClxTest(); void DoSomething(); }; |
#include "lxTest.h" #include using namespace std; ClxTest::ClxTest() {} ClxTest::~ClxTest() {} void ClxTest::DoSomething() { cout << "Do something in class ClxTest!" << endl; } |
#include "lxTest.h" class ClxExp { public: ClxExp(); virtual ~ClxExp(); void DoSomething(); private: ClxTest m_lxTest; void lxTest(); }; |
#include "lxExp.h" ClxExp::ClxExp() ClxExp::~ClxExp() // 其实该方法在这里并没有必要,我这样只是为了说明调用关系 void ClxExp::DoSomething() |
为了让用户能使用我们的类ClxExp,我们必须提供lxExp.h文件,这样类ClxExp的私有成员也暴露给用户了。而且,仅仅提供lxExp.h文件是不够的,因为lxExp.h文件include了lxTest.h文件,在这种情况下,我们还要提供lxTest.h文件。那样ClxExp类的实现细节就全暴露给用户了。另外,当我们对类ClxTest做了修改(如添加或删除一些成员变量或方法)时,我们还要给用户更新lxTest.h文件,而这个文件是跟接口无关的。如果类ClxExp里面有很多像m_lxTest那样的对象的话,我们就要给用户提供N个像lxTest.h那样的头文件,而且其中任何一个类有改动,我们都要给用户更新头文件。还有一点就是用户在这种情况下必须进行重新编译!