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

时间:2020-04-29 13:21:07

标签: 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; 
}

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

3 个答案:

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

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