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;
}