【C++杂记】C++代码接口封装方法

概述

在多人协作开发中,常常会涉及代码打包和接口封装。

方法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;
}

参考文献

[1] C++类怎么将一些成员的声明定义都放到cpp文件中

猜你喜欢

转载自blog.csdn.net/u011362297/article/details/81586802