有什么方法可以维护对对象的引用的结构数组吗?(C++)



我有一个矩阵,我希望能够通过包含对所述矩阵的引用的结构数组共享对该矩阵的访问。

有没有什么方法可以实现这一点,这样我就可以通过从缓冲区中提取来修改矩阵?

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

当然,这样做的问题是,内部有引用的结构没有默认构造函数,因此无法以这种方式初始化。

这是指针的一个很好的用例,因为它们可以是默认构造的,您可以为它们分配不同的变量,而不是引用:

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

要小心跟踪指针指向的对象的生存期,就好像它们在指针之前超出了范围一样,指针将变得悬空。

最好不要将引用视为实际对象,而是"访问对象的方法"的抽象。由于它不是具体的数据,因此无法将其放入容器中。要获得类似效果,最好的办法是创建一个指针数组。根据您的C++标准和内存分配需求,您需要在原始指针或C++11的智能指针(来自<memory>标头(之间进行选择。

您需要首先创建矩阵,以便可以引用它们。这样你就可以正确地初始化引用:

vector<vector<double>> matrices[3];
something buffer[]{matrices[0], matrices[1], matrices[2]};

然而,这并不是唯一的问题。另一种是尝试分配something:

buffer[0] = {a};

这是不允许的,因为something是不可赋值的。它是不可赋值的,因为类包含引用成员。

// want this to print 10

没有办法使全局引用引用引用局部变量。

考虑到您试图以几种与具有引用成员相矛盾的方式使用类,也许最好重新设计为不使用引用。

对于指针来说,这似乎是一个潜在的好用例。与引用不同,指针可以在初始化后分配。但是,在全局数组中存储指向本地对象的指针时要非常小心。最后很容易得到一个无效的指针。

最新更新