【问题标题】:C++ function calling to 2d array [duplicate]C ++函数调用二维数组[重复]
【发布时间】:2015-07-15 07:50:37
【问题描述】:

我在 County.h 类中有构造函数:

struct Country {
    Country(double**, int);
};

我主要有graph[Size][Size],我想调用County的构造函数。

int main() {
    double graph[Size][Size];
    Country c(graph, 0);
}

但它给了我错误no matching function for call to ‘County::County(double [22][22], int)’

我能做些什么来解决这个问题?

【问题讨论】:

  • 您是否尝试过将图形转换为:County c((double **) graph, (int) size); ?
  • 数组数组不是指针数组。
  • @JoeUrc 我怀疑将doubles 重新解释为指针会带来任何有用的东西。
  • @JoeUrc:坏主意。绕过错误会让你犯无声的错误。
  • 有什么理由不使用vector<vector<double>>

标签: c++ arrays


【解决方案1】:

另一种方法是将构造函数声明为模板并通过 (const) 引用传递数组,

struct Country {
    template<size_t N>
    Country(double /*const*/ (&arr)[N][N], int);
};

这样,模板会直接推导出数组的大小。当然,缺点是上述方法不适用于双指针。好处是编译器会严格检查类型,如果数组不是由doubles 组成(在类型推导时不执行转换)或者不是正方形,你的程序甚至不会编译。

【讨论】:

  • 这种方法的问题在于,它将几乎所有必须处理这个数组的东西都链接到一个编译单元中。但是,是的,这似乎是 C++ 能做的最好的事情。在这方面它显然不如 C...
  • @cmaster 我想这就是强制类型安全所要付出的代价。
  • @cmaster 不得不说我对纯C 不是很熟悉。所以你会写像void f(int m, int n, int x[m][n]){}这样的函数并传递尺寸? (我认为您至少需要通过尺寸)。问题是它允许传递不同大小和类型的数组(至少在我的机器上gcc 只会发出警告)。
  • 是的,这就是基本思想。不幸的是,我必须意识到你是对的,gcc 不检查类型。我猜这是gcc 的不足,不是标准,但我可能错了。从理论上讲,可以进行所有必需的类型检查(您不需要知道数组大小必须断言从相同变量派生的两个数组类型相同的值),但它确实增加了一个编译器有点复杂,而且 VLA 不是最常用的功能。
【解决方案2】:

double [Size][Size]double** 根本不是同一类型。那是你的编译器不喜欢的。

更改构造函数原型或声明数组的方式。但是你不能直接将数组数组转换为指针指针。

struct Country {
    Country(double[Size][Size], int);
};

或者:

int main() {
    double** graph = new (double*)[Size];
    for (int i = 0; i < Size; ++i) {
        graph[i] = new double[Size];
    }
    Country c(graph, 0);

    // Don't forget to delete your graph then.
}

请注意,第一个要求您在代码开始执行之前知道大小(例如,将 Size 存储在宏中),但第二个需要更长的编码时间,并且您必须操作更多 RAM记忆力,如果你不小心,可能会导致错误。

【讨论】:

  • 我想我像你的第一个解决方案一样创建了,但我没有给出 Size
  • @Saif 如果在您的 Country.h 中,您编写了带有 double ** 参数的构造函数,这与您没有给出大小完全不同:它是一种不同的变量类型。此处的有效构造函数将在宏中使用 double [x][x]x
猜你喜欢
  • 2018-10-05
  • 2017-02-06
  • 2019-05-11
  • 2019-06-23
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多