我正在创建自己的继承STL的vector类。我在创建对象时遇到了问题。
这是我的班级。
using namespace std;
template <class T>
class ArithmeticVector : public vector<T>{
public:
vector<T> vector; //maybe I should not initalize this
ArithmeticVector(){};
ArithmeticVector(T n) : vector(n){
//something here
};
主要;我在说这个;
ArithmeticVector<double> v9(5);
或
ArithmeticVector<int> v1(3);
我想要的是创建v9
向量或v1
向量,就像STL向量类型一样。但我得到的是我新创建的对象中的向量。我希望我的对象最初是一个向量。
也许我应该在构造函数中使用那个v1
对象?谢谢你的帮助。
答案 0 :(得分:4)
如果您需要std::vector
上的元素操作和数学运算,请使用std::valarray
。如果没有,我不明白你为什么要继承std::vector
。
不要继承表单std::
容器,它们没有虚拟析构函数,如果从指向base的指针中删除,它会在你的脸上爆炸。
编辑如果您需要在std::vector
上定义操作,可以通过定义类外的运算符,并使用其公共接口。
答案 1 :(得分:1)
首先,由于以下行,您发布的代码无法编译:
public:
vector<T> vector; //maybe i should not initalize this
你应该看到这个错误:
declaration of ‘std::vector<T, std::allocator<_Tp1> > ArithmeticVector<T>::vector’
/usr/include/c++/4.4/bits/stl_vector.h:171: error: changes meaning of ‘vector’ from ‘class std::vector<T, std::allocator<_Tp1> >’
因为您在类模板声明之上引入了整个std命名空间,这使得名称“vector”可见,然后使用它来声明一个对象。这就像写“双倍”;
我想要的是像STL矢量一样创建v9矢量或v1矢量 类型。
如果这是你想要的,这是执行它的代码:
#include <vector>
#include <memory>
template
<
class Type
>
class ArithmeticVector
:
public std::vector<Type, std::allocator<Type> >
{
public:
ArithmeticVector()
:
std::vector<Type>()
{}
// Your constructor takes Type for an argument here, which is wrong:
// any type T that is not convertible to std::vector<Type>::size_type
// will fail at this point in your code; ArithmeticVector (T n)
ArithmeticVector(typename std::vector<Type>::size_type t)
:
std::vector<Type>(t)
{}
template<typename Iterator>
ArithmeticVector(Iterator begin, Iterator end)
:
std::vector<Type>(begin, end)
{}
};
int main(int argc, const char *argv[])
{
ArithmeticVector<double> aVec (3);
return 0;
}
如果您对与STL中定义的算法(累积等)不同的向量的算术运算感兴趣,而不是专注于向量类和添加成员函数,您可以考虑为期望特定的向量编写通用算法矢量概念代替。那么你根本不必考虑继承,你的通用算法可以处理向量的不同概念。