【问题标题】:How to Return complex datatypes from functions in C++?如何从 C++ 中的函数返回复杂的数据类型?
【发布时间】:2017-05-27 15:19:28
【问题描述】:

我们如何从函数返回复杂的数据类型,例如指向 int 数组的指针?

考虑下面的(非编译)代码:

int (*) [50] fcreate() 
{
    int (*p) [50]= new int[60][50];
    return p;
}

为什么它不起作用?

Error:
Expected un-qualified id before '(' in :

int (*) [50] fcreate();

【问题讨论】:

  • 为自己省点麻烦,将数组包装在一个类型中,并确保该类型正确拥有内存(如智能指针),更好的是,使用向量并提供一个接受 2 个索引的访问器(和/或 1 个索引)。
  • 语法是int(*fcreate())[50] { //... }。这是一个不带参数并返回指向 int[50] 的指针的函数。
  • 先学点指针和数组
  • 指针既动态又危险。首先了解他们
  • 很抱歉成为初学者...谢谢@Deidei

标签: c++ pointers return-value function-pointers return-type


【解决方案1】:

一种解决方案是首先用现代语法表达函数:

auto fcreate()
    -> int (*)[50]
{ return new int[60][50]; }

auto main()
    -> int
{
    int x = fcreate;    // This won't compile: diagnostic shows syntax for you.
}

然后当你编译这个x 声明的诊断时,会告诉你声明该函数的旧式语法:

foo.cpp:8:13: 错误:从 'int (* (*)())[50]' 到 'int' 的无效转换

即使用旧语法,您可以将此函数定义为

int (*(fcreate)())[50]
{
    return new int[60][50];
}

也就是说,使用std::vector 通常是一个更好的主意。

或使用std::vector 定义的矩阵类用于内部存储。


旧的语法声明看起来很难看,虽然它易于分析,但很难综合。可以通过定义数组项类型的名称来简化它。像这样:

using Array_item = int[50];

Array_item* fcreate()
{
    return new int[60][50];
}

您可以使用 C++03 typedef 代替 using

但是对于现代更清晰的尾随返回类型语法,这种解决方法的优势较小。

【讨论】:

  • @akappa 是的,look at the documentation,它被称为尾随返回类型语法
  • @Borgleader:我知道尾随返回类型语法是什么,但至少在 C++03 中,声明主函数的唯一符合标准的方法是 int main(int, char**)。这在 C++11 中是否已更改?
  • 而且,在main函数中使用它只是在炫耀。
  • @akappa:AFAIK 神圣标准不要求任何声明的任何特定句法形式。 Weasel 短语,因为 C++17 中可能有一些东西,它是如此不可预测。 auto main() -> int 是 C++98 到 C++14 中托管实现的两种明确允许的 main 形式之一,但在 C++98 和 C++03 中,尾随返回类型语法不是t 可以表达它。
  • 好的,刚刚查阅了C++11 标准,这确实是一个合法的main 定义。
【解决方案2】:

正确的语法如下:

int (*fcreate()) [50] {
    int (*p) [50]= new int[60][50];
    return p;
}

或者您可以使用中间别名:

template <typename T, size_t N>
using raw_array = T[N];

raw_array<int, 50>* fcreate() {
  int (*p) [50]= new int[60][50];
  return p;
}

但是,如果您想要一个具有固定大小的二维矩阵的第二维,您宁愿将std::vectorstd::array 结合起来:

auto fcreate() {
    return std::vector<std::array<int, 50>>{};
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多