继承自std :: vector

时间:2014-12-05 15:36:49

标签: c++ visual-c++ inheritance vector subclass

我目前正在创建一个必须从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;
}

3 个答案:

答案 0 :(得分:2)

如果在派生类中没有覆盖有问题的函数,那么 可以称之为:

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的情况非常非常少 适当。你确定你不想要[],并检查边界 你会得到大多数现代实现。

答案 1 :(得分:0)

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

派生的问题在于,它可以将Histogram实例视为std::vector,处理使添加数据成员的值无效的假设。

在更多技术术语中,通过类推导,您无法保证类std::vector提供的类不变。

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

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

答案 2 :(得分:0)

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

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

  • 矢量::的push_back
  • 矢量:: pop_back
  • 矢量::插入

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

您可以通过在子类中使这些函数成为私有成员来实现此目的:

class aHistogram : public vector<int>
{
public:
    aHistogram(){};

private:

    vector<int>::push_back;
    vector<int>::pop_back;
    vector<int>::insert;

    int numx, m, j;
};