【问题标题】:Pass vector by reference to constructor of class通过引用类的构造函数传递向量
【发布时间】:2015-12-30 01:21:32
【问题描述】:

我有一个名为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() 的时候。可能是什么问题?

【问题讨论】:

  • -Wall重新编译,你的编译器会告诉你哪里出了问题。
  • 你认为指针指向什么?
  • @immibis 什么都没有。我才意识到这一点。谢谢。

标签: c++ class oop pointers vector


【解决方案1】:

这是 C++,如果您不是绝对需要,请不要使用原始指针。如果目标是在不复制的情况下获得 std::vector 的所有权,并且您可以使用 C++11,则让您的构造函数接受 r 值引用,并为其提供您已完成填充的 std::vector 的唯一所有权使用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“其他地方”的指针,请确保在原始代码中实际分配ptr = &amp;v;。或new vector 并使用std::shared_ptr 管理testmain 的生命周期。任君挑选。

【讨论】:

    【解决方案2】:

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

    test t(&v);
    

    但是,我认为您更适合这里的参考资料(毕竟它在您问题的标题中!)。使用引用可以避免不必要的语法(例如 -&gt; 而不是 .),这只会不必要地阻碍阅读编写的代码。

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

    【讨论】:

    • 谢谢。我不敢相信我错过了这么简单的事情。不过谢谢你的建议。我试过了,但在编译 error: no matching constructor for initialization of 'test' 时得到以下信息
    • 听起来你没有改变构造函数的签名。
    【解决方案3】:

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

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

    【讨论】:

    • 当您尝试复制指针时,程序已经有UB(参见[dcl.init]/12)。
    【解决方案4】:

    你忘了给你的指针指定想要的值,也就是向量的地址:

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

    在您的代码中,ptr 保持未初始化,您的程序具有未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多