2014-12-05 112 views
0

我目前正在创建一个必须从std :: vector派生的类。我意识到它可能不好做,但我需要。现在我的问题是你如何访问成员函数中创建的向量,基本上使类访问自己像一个整数的常规向量?例如,我正在查找myVector.at(0)的等效项,以返回向量中的第一项。另外,向量的大小应始终6.这​​是我的代码至今:继承std :: vector

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; 
} 
+0

您可以在子类中做这样的功能私有成员实现这一目标。这个问题解决了从标准库类型继承的优点/缺点,以及哪些类型被设计为从继承。这里的OP是问一个简单的语法问题。 – Praetorian 2014-12-05 15:43:05

+0

使用'vector'的成员函数就好像它们是由你的类定义的一样。如果您的类定义了'vector'接口中已存在的成员函数,例如'clear()',则只需明确限定调用。在这种情况下,你可以使用'vector :: clear();'。例如:http://coliru.stacked-crooked.com/a/d3cec10a471438eb – Praetorian 2014-12-05 15:48:35

+0

@Praetorian非常感谢!正是我所需要的。 – Antoninus 2014-12-05 15:54:52

回答

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是 合适。你确定你不想要[],你可以在大多数现代实现中检查 。

+0

谢谢!我绝对想要私人。 – Antoninus 2014-12-06 16:47:14

0

代替从std::vector推导,在这种情况下含有一种(作为数据成员)。

导出的问题是可以将Histogram实例视为std::vector,这样做会使添加数据成员值的假设无效。

在更多的技术术语,用类派生你有没有保证级别不变通过std::vector提供一个以上。

根据经验,一般情况下,类继承想起以前的数据成员的。

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

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; 
}; 
+0

虽然将某些功能私有化并不是未来的证明,但是如果在未来的标准或实现中添加更多可变功能会怎样?更安全地私下继承并允许明确的内容。 – sjdowling 2014-12-05 16:22:40

+0

如果“aHistogram”绑定到对“vector ”的引用,则“vector ”的所有功能都可以直接使用。即这不是一个好的解决方案。通常,派生类可以有意义地开放对事物的访问,但它不能有意义地限制访问。 – 2014-12-05 23:21:57