Inheriting from std:: vector
Inheriting from std:: vector
我目前正在创建一个必须从 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;
};
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g