Inheriting from std:: vector

Inheriting from std:: vector

本文关键字:vector std from Inheriting      更新时间:2023-10-16

我目前正在创建一个必须从 std:: vector 派生的类。我意识到这样做可能不好,但我必须这样做。现在我的问题是你如何访问成员函数中创建的向量,基本上使类访问本身就像整数的常规向量一样?例如,我正在寻找 myVector.at(0( 的等价物来返回向量中的第一项。此外,向量的大小应始终为 6。这是我到目前为止的代码:

class aHistogram : public vector<int>
{
public:
    aHistogram(); //default constructor for histogram class
    void update(int face); //Function to update histogram
    void display(int maxLengthOfLine); //Displays histogram to the scale of maxLengthOfLine using    x's
    void clear();//Function to clear histogram bin counts
    int count(int face) const; // Function to return number of times a face has appeared
private:
    int numx, m, j; //Variables used in functions
};
#endif

需要类访问自身的函数如下,我知道没有称为"myVector"的向量,但我迷失的是能够执行该操作的等效语法。

void aHistogram::clear() 
{
    //Clears bin counts to 0
    myVector.at(0) = 0;
    myVector.at(1) = 0; 
    myVector.at(2) = 0;
    myVector.at(3) = 0;
    myVector.at(4) = 0;
    myVector.at(5) = 0;
}

如果在派生类中未重写有问题的函数,则可以称之为:

void HistoGram::clear()
{
    at( 0 ) = 0;
    //  ...
}

对于运算符也是如此,但您必须使用 (*this) 作为左手操作员:

void HistoGram::clear()
{
    (*this)[0] = 0;
    //  ...
}

如果函数或运算符被覆盖,则必须限定函数名称,

void HistoGram::clear()
{
    std::vector<int>::at( 0 ) = 0;
    //  ...
}

或将 this 指针强制转换为基类类型:

void HistoGram::clear()
{
    (*static_cast<std::vector<int>*>( this ))[0] = 0;
    //  ...
}

但是你确定你想要这里的公共继承吗? 你说向量的大小应始终为 6。 你没有办法保证使用公共继承;至少,你需要私人的继承,然后using您操作的声明想要支持。 (我有几个情况需要限制 std::vector这样的,我已经使用私有实现了遗产。 有时还有转发功能,例如我只想公开函数的const版本。

另外:在非常非常少的情况下,std::vector<>::at适当。 你确定你不想[] ,检查边界您可以获得大多数现代实现。

不是从std::vector派生,在这种情况下包含一个(作为数据成员(。

推导的问题在于,可以将Histogram实例视为只是一个std::vector,做一些使关于添加数据成员值的假设无效的事情。

用更专业的术语来说,使用类派生,你没有保证类不变量高于 std::vector 提供的不变性。

作为一般经验法则,请考虑类继承之前的数据成员。

有时继承是问题,甚至是从标准库容器类继承(例如,std::stack是为继承而设计的(,但在这种情况下不是。

关于这个:向量的大小应始终为 6

您可能希望禁止类用户使用某些功能。例如

  • 向量::p返回
  • 向量::p操作_返回
  • 向量::插入

是可以更改矢量大小的功能。

您可以通过在子类中将此类函数设为私有成员来实现这一点:

class aHistogram : public vector<int>
{
public:
    aHistogram(){};
private:
    vector<int>::push_back;
    vector<int>::pop_back;
    vector<int>::insert;
    int numx, m, j;
};
相关文章: