通过引用类的构造函数传递向量

时间:2015-12-30 01:21:33

标签: c++ class oop pointers vector

我有一个名为test的类,我希望将大型矢量与百万个元素相关联。我试过通过传递一个指向构造函数的指针来做到这一点:

#include <iostream>
#include <vector>
using namespace std;

class test{
public:
    vector<double>* oneVector;
    test(vector<double>* v){
        oneVector = v;
    }
    int nElem(){return oneVector->size();}
};

int main(){
    vector<double>  v(1000000);
    cout << v.size() << endl;
    vector<double>* ptr;

    test t(ptr);
    cout << t.nElem()<< endl;

    return 0;
}

但是,当我尝试Segmentation Fault:11时,这会产生t.nElem()。可能是什么问题?

4 个答案:

答案 0 :(得分:3)

这是C ++,如果你不是绝对需要的话,不要使用原始指针。如果目标是在不复制的情况下取得std::vector的所有权,并且您可以使用C ++ 11,请让您的构造函数接受r值引用,并将其std::vector的唯一所有权归您所有#39;重新填充std::move,这意味着只复制vector个内部指针,而不是数据,避免复制(并保留原始vector空壳):

class test{
public:
    vector<double> oneVector;
    test(vector<double>&& v):oneVector(std::move(v)){
    }
    int nElem(){return oneVector.size();}
};

int main(){
    vector<double>  v(1000000);
    cout << v.size() << endl;

    test t(std::move(v));
    cout << t.nElem()<< endl;

    return 0;
}

如果您确实需要指向vector&#34;其他地方&#34;的指针,请务必在原始代码中实际指定ptr = &v;。或new vector并使用test管理mainstd::shared_ptr的有效期。随便挑选。

答案 1 :(得分:2)

ptr未初始化。你“想要”做的是:

test t(&v);

但是,我认为你在这里更适合引用(毕竟它是你问题的标题!)。使用引用可以避免不必要的语法(例如->超过.),这会不必要地阻碍对所写代码的读取。

class test
{
   std::vector<double>& oneVector;

   public:
      test(vector<double>& v) : oneVector(v) {}

       size_t nElem() const { return oneVector.size(); }
};

答案 2 :(得分:2)

ptr是一个未初始化的指针。此不可预测的值将复制到t.oneVector。取消引用它是未定义的行为。

你需要指针指向一个有效的向量。

答案 3 :(得分:1)

您忘了给指针指定所需的值,即向量的地址:

vector<double>* ptr = &v;
//                 ^^^^^^

在您的代码中,ptr仍然未初始化,并且您的程序有未定义的行为。