使用stl迭代器封装矢量是一种好习惯吗?如果是?怎么可能呢?

时间:2017-04-14 16:45:38

标签: c++ stl encapsulation

我是C ++的新手,我想为我的vector实现封装。

#pragma once

#include <vector>

using namespace std;

class Cell {
public:
    Cell();
    Cell(const Cell& cell);
    void setVector(vector<int> vector[]);
    vector<int> getVector(void)const;

private:
    vector<int> m_vector;
};

我最近读过有关STL迭代器的内容,所以我想知道以这种方式实现setVector()方法是否是一种好习惯?如果是的话,你能举例说明如何做到吗?

1 个答案:

答案 0 :(得分:1)

不是暴露整个向量,而是通过引用或迭代器,您应该只公开实际需要的std::vector成员函数。

或者甚至更准确地说:您应该只展示您实际需要的std::vector功能

查看所有members provided by std::vector:您真的需要Cell来公开,例如allocator_typebackpop_backoperator>=还是shrink_to_fit

实现实际封装而不仅仅是表面伪封装的更强大的解决方案是从Cell成员函数显式委托所需的向量成员函数。例如,如果您只需要大小和单个元素访问权限,那么为什么不只是将size成员函数和elementAt成员函数添加到Cell并将这些函数的实现委托给私人向量?

示例:

#include <vector>

class Cell {
public:
    Cell(std::vector<int> const& vector) : m_vector(vector) {}

    int size() const
    {
        return static_cast<int>(m_vector.size());
    }

    int elementAt(int index) const
    {
        return m_vector[index];
    }

private:
    std::vector<int> m_vector;
};

也许你甚至不需要构造函数中的std::vector参数。您可以获取所需的任何输入,并使用它初始化私有向量。

顺便说一句,C ++ 17很可能建立的最佳实践也需要或至少鼓励您将非成员函数sizeempty添加到类中,为了实现与std::emptystd::size函数的兼容性:

bool empty(Cell const& cell)
{
    return cell.size() == 0;
}

int size(Cell const& cell)
{
    return cell.size();
}