我想创建一个返回数组的函数(在项目中)。我不太确定我该怎么做。
int worker::*codebook(UnitType type){
int code[12];
if (type == UnitTypes::center){
int temp[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
code=temp;
}
return code;
}
其中worker
是类,unitType
是枚举。我在头文件中定义函数如下:
int *codebook(UnitType type);
我的问题如下:
cannot convert from 'int' to 'int Worker::*
对此有何看法?
答案 0 :(得分:5)
代码中的第一个问题是语法。签名应该是:
int* worker::codebook(UnitType type)
然后,它分配给一个数组:
code=temp;
语言不允许这样做。
最后,它返回一个指向局部变量的指针:
return code;
当函数返回时,数组将不再存在,因此任何从外部使用它的尝试都将导致未定义的行为。
现在,回答主要问题,如何从函数中正确返回数组?
一种选择是使用std::vector
:
std::vector<int> worker::codebook(UnitType type) {
std::vector<int> code(12); // vector with 12 zeros
if (type == UnitTypes::center){
code[11] = 1;
}
return code;
}
另一种方法是使用std::array
:
std::array<int, 12> worker::codebook(UnitType type) {
std::array<int, 12> code = {{}};
if (type == UnitTypes::center){
code[11] = 1;
}
return code;
}
答案 1 :(得分:2)
您无法返回本地数组,当函数退出时,它将超出范围。
最好使用实际的数据结构,例如std::vector
。如果你想使用裸C级数组,你必须动态分配内存并为函数添加一种表达数组长度的方法,也许也可以使用size_t& length
参数。
答案 2 :(得分:2)
你在函数原型中有错误:
int worker::*codebook(UnitType type){
应该是
int* worker::codebook(UnitType type){
这是不正确的,因为code
在堆栈上分配并在超出范围时被破坏。
您应该在堆上分配此code
数组。这个函数的主体可能如下所示:
int* code = new int[12];
if (type == UnitTypes::center){
int temp[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
memcpy(code, temp, 12*sizeof(int));
}
return code;
但是当调用者完成此数组时,调用者应该调用delete[]
:
int* array = codebook(type);
delete[] array;
丑陋的内存管理与这种解决方案相关联。由于您使用的是C ++,因此您应该使用一些使其更容易的对象(例如std::vector
)。
希望这有帮助。
答案 3 :(得分:1)
签名应为:
int* worker::codebook(UnitType type)
请注意,您遇到了未定义的行为。
int code[12];
是一个局部变量,当函数退出时会被销毁。而你正在归还它。永远不要这样做。您应该通过new
动态分配数组。
答案 4 :(得分:0)
这应该是int* worker::codebook(UnitType type)
。 *
与int
一致,使其成为指向int
(int*
)的指针。
但是,你真的不希望return code
这样 - 当函数退出时,code
将指向垃圾(因为它是在堆栈上分配的)
答案 5 :(得分:0)
您的指针声明位置错误。
int* worker::codebook(UnitType type)
但是,请注意,您正在堆栈上创建数组,当您的函数退出时,该数组将被销毁。您需要使用new
在堆上创建它,并在完成后记住delete
。
答案 6 :(得分:0)
你不想这样做,因为这里数组内存在函数内部分配,并在函数完成时消失。在内存/数组中分配函数,并在其中一个参数中将数组作为指针传递。
答案 7 :(得分:0)
您可以将数组埋入结构中,然后按值返回结构 - 经典C样式:
struct my_array
{
int code[12];
};
my_array worker::codebook(UnitType type){
my_array arr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
if (type == UnitTypes::center){
arr.code[11] = 1;
}
return arr;
}