我有两个类A
和B
,其中B
使用类A
的对象,类似这样的
class A {
private:
int foo_;
A(const int &foo): foo_(foo) {}
}
class B {
// STUFF
inline C operator()(A a)
}
目前,我已将两者的定义放在.h
文件中,代码编译并正确执行。
我的问题是:我可以掩盖类A
的实现多少,例如将代码行移动到.cpp
文件以进行单独编译和链接?我可以屏蔽private
成员和方法(外部用户不直接访问的所有内容)的实现吗?怎么样?我应该使用哪些C ++关键字?
非常感谢你。
答案 0 :(得分:4)
掩码实现可以通过PIMPL idiom或使用简单的多态(Factory method pattern来完成。基本上,你创建一个接口类,比如说IA
:
/* File: A.h */
#include <memory> /* For std::shared_ptr */
class IA;
/* Change the line below to boost::shared_ptr<> or
* another implementation of a shared-pointer.
* Read more:
* http://en.wikipedia.org/wiki/Smart_pointer#shared_ptr_and_weak_ptr
*/
typedef std::shared_ptr<IA> APtr;
class IA {
public:
static APtr Create(const int foo);
IA(){}
virtual ~IA(){}
virtual void somePublicMethod() = 0;
};
在您的A.cpp中,您将拥有它的实现:
/* File: A.cpp */
#include "A.h"
class A : public IA
{
public:
A(const int foo):foo_(foo){}
void somePublicMethod(){/* Your awesome implementation goes here */}
};
APtr IA::Create(const int foo)
{
return APtr(new A(foo));
}
这样,您只传递接口并仅将公共方法公开给外部世界,其内部结构位于您的CPP文件中。
优点:
缺点:
Create()
。答案 1 :(得分:2)
关于pImpl成语可以隐藏的内容:
Impl
类答案 2 :(得分:2)
如果您不需要C operator()(A a)
为inline
,您可以转发声明参数A
,如下所示
class A;
然后,您可以将其定义移动到另一个标题,并将其包含在它使用的位置。
以下是有关forward declaration的详细信息。