2

我正在创建自己的继承 STL 的矢量类。创建对象时遇到问题。

这是我的课。

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在构造函数中使用那个对象?感谢帮助。

4

2 回答 2

4

如果您需要对 a 进行元素运算和数学运算std::vector,请使用std::valarray. 如果不是,我不明白你为什么要子类化std::vector

不要继承表单std::容器,它们没有虚拟析构函数,如果从指向基础的指针中删除,它们会在你的脸上爆炸。

编辑如果您需要在 上定义操作std::vector,您可以通过在类之外定义运算符,并使用其公共接口。

于 2013-05-19T15:15:19.283 回答
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”可见,然后您使用它来声明一个对象。这就像写“双双;”。

我想要的是创建 v9 向量或 v1 向量,就像 STL 向量类型一样。

如果这是您想要的,这是执行此操作的代码:

#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 中定义的算法(累加等)的向量上的算术运算感兴趣,而不是专注于向量类并添加成员函数,您可以考虑为期望特定向量的向量编写通用算法代替。然后您根本不必考虑继承,并且您的通用算法可以在向量的不同概念上工作。

于 2013-05-19T15:31:48.583 回答