试图将复杂数组存储到类c ++中

时间:2013-09-22 00:01:16

标签: c++ arrays class

我对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])'

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

但是,我建议不要使用原始数组,然后转移到std::vectorstd::array,这当然可以嵌套:

std::vector<std::array<int, 2>> arr = {
    {{ 1, 2 }},
    {{ 3, 4 }}
};

答案 1 :(得分: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]

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