在构造函数中填写我自己的vector类(c ++)

时间:2017-12-22 19:23:47

标签: c++

我创建了自己的vector类,我有两个构造函数:

1)第一个创建一个维度为dim

的零向量

2)第二个作为输入向量v并填写我自己的Vector:

//Vector:
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
#include <cmath>
using namespace std;

class Vector{
private:
    int dim;
    double *elem;

public:
    Vector(int dim); //n-dimensional zero vector
    Vector(const vector<double>& v); // vector based on the input coordinates
    double& operator[](int i) const {return elem[i];}
    Vector operator+(const Vector& v);
    Vector operator-(const Vector& v);
    Vector operator*(const Vector& v);
    void norm();
    int get_size() const {
        return dim;
    }


};

Vector::Vector(int size){
    elem = new double[size]; //adress of the array
    dim = size;
    for(int i = 0;i<size; ++i){
        elem[i] = 0;
    }
}

Vector::Vector(const vector<double>& v){
    for(unsigned i = 0;i<v.size();++i){
        elem[i] = v[i];
    }
    dim = v.size();
}
编译器没有错误,但是当我尝试填充我的向量时没有任何反应。

int main(){

    Vector v1(3);
    vector<double> vect = {1,2,3};
    Vector v2(vect);
    for(int i = 0;i<v1.get_size();++i){
        cout << v1[i];
        }

}

你能告诉我,我在哪里犯了错误吗?

2 个答案:

答案 0 :(得分:2)

你的程序表现出不明确行为的迹象。

未定义的行为源于错误实现的第二个构造函数。

您正在使用:

Vector::Vector(const vector<double>& v){
    for(unsigned i = 0;i<v.size();++i){
        elem[i] = v[i];
    }
    dim = v.size();
}

但您尚未为elem分配内存。在为其分配值之前,需要先为其分配内存。

Vector::Vector(const vector<double>& v){
    elem = new double[v.size()]; // Need this.
    for(unsigned i = 0;i<v.size();++i){
        elem[i] = v[i];
    }
    dim = v.size();
}

另外,请阅读the rule of three并确保正确实现复制构造函数,析构函数和复制赋值运算符。

暂且

由于您在界面中使用std::vector<double>,是否有任何理由不能在实现中使用它?

使用

class Vector{
  private:
    std::vector<double> elem;

  ...
};

会使您的实施变得不那么麻烦且容易出错。

答案 1 :(得分:1)

需要std::vector的构造函数需要先调整内部数组的大小

Vector::Vector(const vector<double>& v){
    elem = new double[v.size()];
    for(unsigned i = 0;i<v.size();++i){
        elem[i] = v[i];
    }
    dim = v.size();
}

顺便说一句,你应该有一个析构函数,这样你就不会泄漏内存

Vector::~Vector()
{
    delete[] elem;
}