Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用将向量传递给类的构造函数_C++_Class_Oop_Pointers_Vector - Fatal编程技术网

C++ 通过引用将向量传递给类的构造函数

C++ 通过引用将向量传递给类的构造函数,c++,class,oop,pointers,vector,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;

我有一个名为
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;
}
#包括
#包括
使用名称空间std;
课堂测试{
公众:
向量*oneVector;
测试(向量*v){
oneVector=v;
}
int nElem(){return oneVector->size();}
};
int main(){
向量v(1000000);

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

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

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

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

test t(&v);
但是,我认为您最好在这里使用引用(毕竟,它在您问题的标题中!)。使用引用可以避免不必要的语法(如
->
而不是
),这会不必要地阻碍对所写代码的阅读

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

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

       size_t nElem() const { return oneVector.size(); }
};
类测试
{
std::vector&oneVector;
公众:
测试(向量&v):一个向量(v){}
size_t nElem()常量{return oneVector.size();}
};

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


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

< p>这是C++,如果你不需要的话,不要用原始指针。如果目标是拥有一个<代码>:ST::vector < /Cord>不复制,你可以使用C++ 11,让构造函数接受一个R值引用,并给它唯一的所有权:<代码> STD::vector/使用
std::move
填充完的code>,这意味着只有
vector
的内部指针被复制,而不是数据,从而避免了复制(并将原始
vector
保留为空外壳):

类测试{
公众:
矢量一矢量;
测试(向量和v):一个向量(标准::移动(v)){
}
int nElem(){return oneVector.size();}
};
int main(){
向量v(1000000);

无法使用
-Wall
重新编译,编译器将告诉您出了什么问题。您认为指针指向什么?@immibis没什么。我刚刚意识到。谢谢。谢谢。我不敢相信我错过了这么简单的内容。但感谢您的建议。我尝试了它,但在编译
错误时我得到了以下信息:没有匹配的cons“test”初始化的构造函数
听起来好像您没有更改构造函数的签名。当您尝试复制指针时,程序已经有UB(参见[dcl.init]/12)。
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;
}