2012-08-25 122 views
2

我需要返回枚舉陣列的方法的數組,我想:函數返回枚舉

note_name *AppSettings::getNoteMap(){ 
    note_name notes[] = {..} 
} 

我上,這樣我應該返回的第一個元素的地址讀某處數組,所以這就是爲什麼有一個指針。這雖然給我一個警告:address of stack memory associated with local variable notes returned

如何擺脫警告並正確返回數組?

+0

可能的重複[可以訪問本地變量的內存超出其範圍?](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-範圍) –

回答

4

您不能從函數period中返回數組。你可以返回一個指向動態分配的內存塊的指針(我不會去這條路徑),或者把指針(和大小一起)作爲輸出參數,或者返回一個指向靜態數組的指針,或者返回一個vector<T>或其他收藏品。我想用std::vectorstd::array

std::vector<note_name> foo() { 
    std::vector<note_name> ret; 
    // populate 'ret' 
    return ret; 
} 
2

使用std::vectorstd::array,其他一些收集或dynamic-array(即使用new,而不是分配堆棧),因爲從職能範圍的退出後您的陣列將一些垃圾被破壞,你將有指針,它指向記憶。我認爲你知道enum中有多少個值,如果你有C++ 11,你可以使用std::array

std::array<note_name> foo() { 
    std::array<note_name, size> ret = { ... }; // fill ret, instead of ... 
    return ret; 
} 
2

要做到這一點這樣你就需要動態分配數組並返回該得到由相應的調用返回到new指針。您不能將指針返回到函數本地的變量,因爲函數退出後它將不再存在。使用new將確保內存在函數退出後保留在堆上。當您使用C++,你會使用std::vector,並可以更好的服務你的函數返回一個向量的實例

+0

另外,使用'new'時,確保接收函數在完成時調用'delete'。'shared_ptr'或'unique_ptr'也可能是合適的。 – MartyE

+0

@MartyE boost :: shared_array會更好。 – ForEveR

1

讓我們來看看你寫的:

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代替。

+0

如果我想返回它,矢量是否也需要是靜態的? – networkprofile

+1

如果您按價值歸還它,您應該這樣做。 –