概述
在多人协作开发中,常常会涉及代码打包和接口封装。
方法1:对原功能代码再包一层
由于我们不想暴露AImpl.h中,故对其封装,即在A.h和A.cpp中对其包一层。
我们甚至在A.h中都不需要声明 AImpl *imp_的,在A.h中可以只声明一个void *imp_,在A.cpp中将该void *指针转换成Almpl *即可。
AImpl.h [1]
class AImpl
{
public:
...
private:
int a;
...
};
A.h
class AImpl;
class A
{
public:
A();
~A();
void f();
private:
AImpl *imp_;
};
A.cpp
#include "AImpl.h"
#include "A.h"
A::A()
: imp_(new AImpl)
{
}
A::~A()
{
delete imp_;
}
void A::f()
{
imp_->f();
}
最后如果还想将其打包成DLL动态库,可参见 Windows DLL动态库打包与使用
方法2:父类声明为纯虚函数
可以给对方提供纯虚接口头文件[1],举例如下:(这种放我还没试过。)
IBase.h
#pragma once
class IBase
{
public:
IBase(void);
virtual ~IBase(void);
virtual void Release() = 0;
virtual void Do() = 0;
};
IBase *Create();
IBase.cpp
#include "StdAfx.h"
#include "IBase.h"
#include "Base.h"
IBase::IBase(void)
{
}
IBase::~IBase(void)
{
}
IBase * Create()
{
return new CBase;
}
Base.h
#pragma once
#include "ibase.h"
class CBase :
public IBase
{
public:
CBase(void);
virtual ~CBase(void);
virtual void Release();
virtual void Do();
private:
int m_nID;
};
Base.cpp
#include "StdAfx.h"
#include "Base.h"
CBase::CBase(void)
{
m_nID = 0;
}
CBase::~CBase(void)
{
}
void CBase::Release()
{
delete this;
}
void CBase::Do()
{
m_nID++;
}
main.cpp
#include "StdAfx.h"
#include "IBase.h"
int main()
{
IBase *poBase = Create();
if (NULL != poBase)
{
poBase->Do();
poBase->Release();
poBase = NULL;
}
return 0;
}