c++ - 接口(interface)传递接口(interface)容器

标签 c++ oop iterator

如果有一个方法签名如下的接口(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/

相关文章:

c++ - C++中类字段对齐与对象实例对齐的关系?

c++ - Eigen::RowVector 迭代器

c++ - 迭代器的类型 : Output vs. 输入与前向与随机访问迭代器

C++ 迭代器异常安全

oop - 向子类添加公共(public)方法是否违反 LSP(Liskov 替换原则)?

android - 在 C++ 中连接字符串并使用系统执行的正确方法是什么

c++ - 清除cin input : is cin. ignore不是好办法吗?

c++ - 尝试将指针数组传递给方法并返回它

C++ 对 const 引用参数的依赖没有改变

javascript - 为什么我需要使用 'this' 来访问映射中的值?