我有一个矩阵,希望能够通过包含对该矩阵引用的结构数组共享访问权限。
有什么方法可以做到这一点,以便我可以通过从此缓冲区中拉出来修改矩阵?
struct something {
vector<vector<double>> &a;
};
something buffer[3];
void modify(something &arr) {
(arr.a)[0][0] = 10;
cout << (arr.a)[0][0] << endl;
}
int main(int argc, const char * argv[]) {
vector<vector<double>> a(5, vector<double>(5));
buffer[0] = {a};
modify(buffer[0]);
// want this to print 10
cout << a[0][0] << endl;
return 0;
}
当然,此问题是内部带有引用的结构没有默认构造函数,因此无法以这种方式初始化。
答案 0 :(得分:1)
您需要首先创建矩阵,以便您可以参考它们。这样,您可以正确初始化引用:
vector<vector<double>> matrices[3];
something buffer[]{matrices[0], matrices[1], matrices[2]};
但这不是唯一的问题。另一个是您尝试分配something
:
buffer[0] = {a};
不允许这样做,因为something
是不可分配的。该类包含引用成员,因此无法分配。
// want this to print 10
没有办法使全局引用引用局部变量。
鉴于您试图以几种与使用引用成员矛盾的方式使用该类,也许最好重新设计它以不使用引用。
这似乎是一个潜在的好用例。与引用不同,可以在初始化后分配指针。但是,在全局数组中存储指向本地对象的指针时要非常小心。以无效的指针结束很容易。
答案 1 :(得分:1)
最好将引用视为不是实际的对象,而是对“访问对象的方法”的抽象。由于不是具体数据,因此无法将其放入容器中。实现类似效果的最佳选择是创建一个指针数组。根据您的C ++标准和内存分配需求,您需要在原始指针或C ++ 11的智能指针之间进行选择(来自<memory>
标头)。
答案 2 :(得分:1)
这是一个很好的用例,因为可以默认构造指针,并且可以为它们分配不同的变量,与引用不同:
struct something {
vector<vector<double>> *a = nullptr; //pointer variable
};
something buffer[3];
void modify(something &arr) {
//include nullptr check to prevent segmentation error
if(!arr.a) return;
//dereference arr.a to access it
(*(arr.a))[0][0] = 10;
cout << (*(arr.a))[0][0] << endl; //dereference arr.a to access it
}
int main(int argc, const char * argv[]) {
vector<vector<double>> a(5, vector<double>(5));
buffer[0] = {&a};
modify(buffer[0]);
// want this to print 10
cout << a[0][0] << endl;
return 0;
}
小心跟踪指针所指向的对象的生存期,就好像它们在指针执行之前超出范围一样,指针将变得悬空。