通过引用将向量传递给类的构造函数
Pass vector by reference to constructor of class
我有一个名为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()
时。可能是什么问题?
这是
C++,如果不是绝对需要,请不要使用原始指针。如果目标是在不复制的情况下获得std::vector
的所有权,并且您可以使用 C++11,让您的构造函数接受 r 值引用,并赋予它您用 std::move
填充完成的std::vector
的唯一所有权,这意味着只有 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 = &v;
。或者new
vector
,并通过std::shared_ptr
管理跨test
和main
的生命周期。任你挑选。
ptr
未初始化。 你"想要"做的是:
test t(&v);
但是,我认为您更适合在这里引用(毕竟这是您问题的标题! 使用引用避免了不必要的语法(如->
超过.
(,这只会不必要地阻碍编写代码的阅读。
class test
{
std::vector<double>& oneVector;
public:
test(vector<double>& v) : oneVector(v) {}
size_t nElem() const { return oneVector.size(); }
};
ptr
是一个未初始化的指针。此不可预测的值将复制到 t.oneVector
。取消引用它是未定义的行为。
您需要指针实际指向有效向量。
你忘了给你的指针所需的值,即向量的地址:
vector<double>* ptr = &v;
// ^^^^^^
在代码中,ptr
保持未初始化状态,并且程序具有未定义的行为。
相关文章:
- 在类构造函数中传递对外部函数的引用
- 在 c++ 中将变量作为结构构造函数中的引用传递
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 移动构造函数和右值引用
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 为什么我需要在转换构造函数上引用 this->?
- 关于隐式声明的复制构造函数的引用在逻辑上不清楚
- C++:右值引用构造函数和复制省略
- CLion - 无法解决类中对构造函数的未定义引用
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 调用默认构造函数时不引用它
- C++ 构造函数传递对基类对象的引用
- 使用默认构造函数引用成员变量初始化错误
- 构造函数引用参数导致seg错误
- 未定义的类构造函数引用,当它被正确定义时
- 如何从父类构造函数引用重写的静态方法
- 创建构造函数引用全局变量的类的全局实例时,C++ 程序崩溃