如何从C ++中的函数返回复杂的数据类型?

时间:2017-01-12 13:29:48

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

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

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

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

为什么它不起作用?

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

int (*) [50] fcreate();

2 个答案:

答案 0 :(得分:4)

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

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: error: invalid conversion from 'int (* (*)())[50]' to '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 using

代替typedef

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

答案 1 :(得分:3)

正确的语法如下:

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>>{};
}