0

我对 C++ 不是很好,并且想知道为什么数组内部的数组会发生错误,但是对于普通数组却可以正常工作(以及如何修复它)。

继承人的代码(只是试图在构造它的类中存储一个数组):

class foo {
    int* stored;
public:
    foo(int* ptr) {
        stored = ptr;
    }
};

int main() {
    int arr[][2] = {{1,4},{5,7},{2,5}};
    foo obj(arr);
}

当数组像int arr[] = {1,2,3}它一样工作时没有错误,但正常代码给了我这个错误:

error: no matching function for call to 'foo::foo(int [3][2])'

我搜索了一段时间,但我真的不知道首先要搜索什么,这就是我在这里问的原因(但我觉得它与指针有关)。谢谢你的帮助。

4

2 回答 2

1

您尝试将整数数组的数组作为单个整数指针传递,但这是行不通的。虽然数组在传递时会衰减为指针,但数组数组不能是单个指针,也不能是指向指针的指针。

但是,它可以用作指向数组的指针:

class foo
{
    int (*stored)[2];

public:
    foo(int (*ptr)[2]) : stored(ptr) {}
};

声明中的括号是必需的,否则它将是一个指针数组。

但是,我建议不要使用原始数组,而是移至std::vectoror std::array,这当然可以嵌套:

std::vector<std::array<int, 2>> arr = {
    {{ 1, 2 }},
    {{ 3, 4 }}
};
于 2013-09-22T00:07:59.287 回答
1

首先,您的代码(即使它有效)不会存储数组。在您的班级中,您有一个指针,因此您所存储的只是指向数组的指针。让这些区别在你的脑海中清晰是很重要的。

您必须声明一个与您尝试“存储”的数组兼容的指针。该指针是int (*stored)[2],它是一个指向两个整数数组的指针。

其实很简单

int* is compatible with int[]
int (*)[N] is compatible with int[][N]
int (*)[N][M] is compatible with int[][N][M]

等等等等。但是括号确实让人们感到困惑。它们是必要的,因为*运算符的优先级低于[]运算符。

于 2013-09-22T00:11:25.513 回答