如果有一个方法签名如下的接口(interface),
class Interface2
{
public:
virtual ~Interface2() {}
virtual uint getId() = 0;
virtual std::string getName() = 0;
};
class Interface
{
public:
virtual ~Interface(){}
virtual std::list<Interface2*> getData(uint id) = 0;
};
所以基本上 getData(uint id)
的目的是公开 Interface2
接口(interface)的内部存储
当实现一个具体类Interface
时,它会保留由Interface2
具体类组成的对象的存储。
例如,以下可能是实现这些接口(interface)的一种方式
class Interface2Imp : public Interface2
{
public:
uint getId() { return id;}
std::string getName() { return name;}
private:
uint id;
std::string name;
};
class InterfaceImp : public Interface
{
public:
std::list<Interface2*> getData(uint id)
{
std::list<Interface2*> returnList;
std::list<Interface2Imp> & a = storage[id];
for(auto & it : a)
{
returnList.push_back(&it);
}
return returnList;
}
private:
std::map<int, std::list<Interface2Imp> > storage;
}
但看看 getData(uint id)
是如何实现的,我们可以看到它遍历其内部存储,然后再次将其填充到接口(interface)列表中,这看起来很昂贵(而且很丑) .
有没有更好的方法来暴露一个接口(interface)的内部数据,而这个接口(interface)恰好也被暴露为接口(interface)?
最佳答案
就目前而言,必须进行迭代和复制。该类存储 X 的实例列表,您需要指向 X 实例的指针列表。这是两个不同的东西。您也许可以做一些 std::algorithm 之类的事情,但这不会改变必须完成迭代和克隆的事实。
如何更改接口(interface)和实现。让类 InterfaceImp
存储一个 shared_ptr 列表到 Interface
,并让 getData 方法返回一个 shared_ptr 列表。现在容器可以直接返回它的数据了。 (你也没有移动原始指针)
话虽如此,您目前拥有的是更好的封装。您没有将内部数据暴露给调用者,而是在克隆它。
关于c++ - 接口(interface)传递接口(interface)容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53524727/