我创建了自己的向量类,我有两个构造函数:
1)第一个使用尺寸dim
2)第二个作为输入向量V并填充我自己的向量:
//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];
}
}
你能告诉我,我在哪里犯了一个错误?
您的程序表现出不确定行为的迹象。
未定义的行为源于未正确实现的第二个构造函数。
您正在使用:
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();
}
另外,请阅读三个规则,并确保正确地实现复制构造函数,破坏者和副本分配运算符。
旁边
由于您在接口中使用了std::vector<double>
,因此有什么原因不能在实现中使用它?
使用
class Vector{
private:
std::vector<double> elem;
...
};
将使您的实施不那么麻烦,并且容易出错。
需要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;
}