gpt4 book ai didi

c++ - 为 STL vector 构建接口(interface)

转载 作者:行者123 更新时间:2023-11-30 02:06:37 24 4
gpt4 key购买 nike

我正在考虑为 C++ STL 容器 vector 构建一个包装器( vector 可以提供更多的功能(加载、保存等),因此它需要一个包装器)。

我的包装器的使用者需要遍历元素,如果我公开 STL 迭代器,稍后更改实现将需要我的调用者重新编译(而且我觉得我正在破坏封装)。

我想创建一个只返回原始类型的接口(interface),以确保如果我更改实现,客户端不需要重新编译。我正在考虑将 vector 大小公开为一个整数(类似于 MFC CArray 的做法)并重载 [ ] 运算符,调用者可以那样循环 vector 。

我的问题:

  1. 如果我想为 vector 大小返回一个 int,它如何与 size_type 一起使用? Size_type 似乎不应该在接口(interface)中公开,因为如果它发生更改,调用者将需要重新编译。如果事实证明 size_type 可以大于整数,我很乐意施加某种限制(我不希望我有那么多元素!)
  2. 使用 [ ] 运算符循环 vector 比使用迭代器要差得多

已编辑: 删除了“通用”一词 - 这与模板无关,它只是一个类。还阐明了“公开原始类型”是指返回 int 而不是数据成员本身的方法。

最佳答案

您可以定义您的客户将引用的单例 ifc(纯虚拟)类。我认为这种设计模型称为“Singelton 工厂方法”。希望我的详细回答对您有所帮助:)。

只要您不更改公共(public)接口(interface)(方法列表),您的客户就不需要在您更改代码时重新编译。

类似于:

myClassIfc.h:

Class myClassIfc
{
public:
virtual ~myClassIfc();

///// list all your pure virtual public ifc methods here ////
void m_zRunMyMethod(int nNumber) = 0;
int m_nSize() = 0;

static myClassIfc* ms_pGetImplObj();

protected:
myClassIfc();
static myClassIfc* ms_pImplObj;
}

inline myClassIfc* myClassIfc::ms_pGetImplObj()
{
return ms_pImplObj;
}

我的类Ifc.cpp:

#include myClassIfc.h

myClassIfc::myClassIfc()
{
}
myClassIfc::~myClassIfc()
{
}

myClass.h - 实现你的纯虚类

Class myClass: public myClassIfc
{
public:
virtual ~myClass();

void m_zRunMyMethod(int nNumber);
int m_nSize();

static void ms_zCreate();
static void ms_zDestroy();

protected:
myClass();

private:
vector<int> myInternalVector;
}

我的类.cpp:

#include myClass.h

void myClass::m_zRunMyMethod(int nNumber)
{
/// your action
printf("%d\n", nNumber);
}

int myClass::m_nSize()
{
return int(myInternalVector.size());
}

void myClass::ms_zCreate()
{
if (NULL != ms_pImplObj)
{
return;
}
ms_pImplObj = (myClass*) new myClass();
}

void myClass::ms_zDestroy()
{
if (NULL == ms_pImplObj)
{
return;
}
delete ms_pImplObj;
ms_pImplObj = NULL;
}

现在在完成上述长期的基础架构工作后,您的客户需要使用

#include myClassIfc.h


void main(void)
{
myClassIfc::ms_pGetImplObj()->m_zRunMyMethod(5);
myClassIfc::ms_pGetImplObj()->m_nSize();
}

我唯一没有在上面列出的是你的内存管理,这意味着谁自己创建单例对象(调用派生类的 ms_zCreate() 静态 API)。您可以从其他地方调用它,也可以直接从您的代码中调用它。

请注意,您可以将上述 ifc 方法操纵为非单例实现。只要 ifc 类没有改​​变,如果您修改派生(实现)类,客户端代码就不需要重新编译。

关于c++ - 为 STL vector 构建接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8664471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com