【问题标题】:Can i somehow copy member types from vector?我可以以某种方式从向量中复制成员类型吗?
【发布时间】:2020-10-09 11:53:42
【问题描述】:

我正在编写将 std::vector 作为私有字段的 MyVector 类。 MyVector 类应该提供 std::vector 的所有成员类型。我怎么解决这个问题?是这样复制它们的正确方法(但它不起作用):

class MyVector{
    private:
        vector<int> numbers;
    public:
        using value_type = vector<int>::value_type;
        using size_type = vector<int>::size_type;
        using iterator = vector<int>::iterator;
        using allocator_type = vector<int>::allocator_type;
        using difference_type = vector<int>::difference_type;
        using reference = vector<int>::reference;
        using const_reference = vector<int>::const_reference;
        using pointer = vector<int>::pointer;
        using const_pointer = vector<int>::const_pointer;
        using const_iterator = vector<int>::const_iterator;
        using reverse_iterator = vector<int>::reverse_iterator;
        using const_reverse_iterator = vector<int>::const_reverse_iterator;
};

【问题讨论】:

  • 你可以继承它,虽然这样做不是一个好主意。
  • 为什么你认为这行不通?
  • 你上课的目的是什么?它应该解决什么潜在的问题?
  • 我看到你没有使用std::vector,所以你必须在某个地方有using namespace std;。请阅读stackoverflow.com/questions/1452721/…
  • 听起来像XY Problem

标签: c++ vector


【解决方案1】:

没有办法做到这一点。

您可以通过publicly inheriting it and understanding how to cope with the lack of virtual destructor 继承std::vector 的所有成员(谢谢@M.A),或者您可以随意挑选。没有其他方法可以指定要继承的成员。

但我个人的建议是不要继承std::vector。最好明确说明您想要“继承”什么并按照您的方式做。我们的目标不应该是节省击键次数。

【讨论】:

    【解决方案2】:

    如果您想有选择地使用 std::vector 的某些部分,您始终可以使用 私有继承 并在派生的公共接口中公开您想要的那些功能:

    template<typename T>
    class MyVector
    : private std::vector<T>
    {
    private:
        using base_type = std::vector<T>;
    
    public:
        using base_type::value_type;
        using base_type::iterator;
        using base_type::pointer;
        using base_type::reference;
        // ... etc ...
    
        using base_type::begin;
        using base_type::end;
        using base_type::operator[];
        // ... etc ...
    
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      相关资源
      最近更新 更多