在构造函数中使用对象

时间:2013-05-19 15:10:01

标签: c++ inheritance vector stl constructor

我正在创建自己的继承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对象?谢谢你的帮助。

2 个答案:

答案 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中定义的算法(累积等)不同的向量的算术运算感兴趣,而不是专注于向量类和添加成员函数,您可以考虑为期望特定的向量编写通用算法矢量概念代替。那么你根本不必考虑继承,你的通用算法可以处理向量的不同概念。