Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数返回枚举数组_C++_Arrays_Pointers_Return - Fatal编程技术网

C++ 函数返回枚举数组

C++ 函数返回枚举数组,c++,arrays,pointers,return,C++,Arrays,Pointers,Return,我需要一个返回枚举数组的方法,我尝试了: note_name *AppSettings::getNoteMap(){ note_name notes[] = {..} } 我读了上面的某个地方,所以我应该返回数组第一个元素的地址,这就是为什么会有一个指针。但这给了我一个警告:与返回的局部变量notes关联的堆栈内存地址 如何消除警告并正确返回数组?使用std::vector、std::array、其他一些集合或动态数组(即使用新建,而不是堆栈上的分配),因为退出函数范围后,数组将被销毁

我需要一个返回枚举数组的方法,我尝试了:

note_name *AppSettings::getNoteMap(){
    note_name notes[] = {..}
}
我读了上面的某个地方,所以我应该返回数组第一个元素的地址,这就是为什么会有一个指针。但这给了我一个警告:
与返回的局部变量notes关联的堆栈内存地址


如何消除警告并正确返回数组?

使用
std::vector
std::array
、其他一些集合或
动态数组(即使用
新建
,而不是堆栈上的分配),因为退出函数范围后,数组将被销毁,并且您将拥有指针,指向内存中的一些垃圾。我认为您知道在
enum
中有多少个值,如果您有C++11,则可以使用
std::array

std::array<note_name> foo() {
   std::array<note_name, size> ret = { ... }; // fill ret, instead of ...
   return ret;
}
std::vector<note_name> foo() {
    std::vector<note_name> ret;
    // populate 'ret'
    return ret;
}
std::array foo(){ std::array ret={…};//填充ret,而不是。。。 返回ret; }
不能从函数、句点返回数组。您可以返回指向动态分配的内存块的指针(我不会这样做),或者将指针(以及大小)作为输出参数,或者返回指向静态数组的指针,或者返回向量或其他集合

我会使用
std::vector
std::array

std::array<note_name> foo() {
   std::array<note_name, size> ret = { ... }; // fill ret, instead of ...
   return ret;
}
std::vector<note_name> foo() {
    std::vector<note_name> ret;
    // populate 'ret'
    return ret;
}
std::vector foo(){ std::载体ret; //填充“ret” 返回ret; }
要这样做,您需要动态分配数组,并返回相应调用
new
返回的指针。不能返回指向函数本地变量的指针,因为函数退出后该变量将不再存在。使用new将确保在函数退出后内存仍保留在堆上。当你使用C++时,你可以更好地使用<代码> STD::vector < /Cord>,并使函数返回一个向量

的实例。让我们看看你写的:

note_name *AppSettings::getNoteMap(){
    note_name notes[] = {..}
}
数组
notes
是一个局部变量,当函数返回时将自动清除该变量。如果返回指向它的指针,则返回指向不再存在的数组的指针。这就是编译器抱怨的原因

如果数组的大小和内容在编译时已知,则声明数组static const。然后可以返回对数组的引用。语法有点奇怪:

static const std::size_t note_names_size = 42;
note_name const (&AppSettings::getNoteMap())[note_names_size] {
    static note_name const notes[note_names_size] = { ... };
    return notes;
}
如果数组的大小在编译时已知,但内容未知,请使用
std::array
。您可以声明局部变量,填写它,然后按值返回它


如果在编译时数组的大小和内容未知(或者如果您的库未实现
std::array
),请使用
std::vector

此外,使用
new
,确保接收函数在完成后调用
delete
shared_ptr
unique_ptr
也可能是合适的。@MartyE boost::shared_数组会更好。如果要返回向量,向量是否也需要是静态的?如果按值返回,则不需要,您应该这样做。