2011-09-23 292 views
13

我是C++新手。 對於一個學校項目,我需要做一個函數,它將能夠返回一個字符串數組。在C++函數中返回字符串數組

目前我有這在我的頭:

的config.h

string[] getVehicles(void); 

Config.cpp

string[] Config::getVehicles(){ 
string test[5]; 
test[0] = "test0"; 
test[1] = "test1"; 
test[2] = "test2"; 
test[3] = "test3"; 
test[4] = "test4"; 

return test;} 

顯然,這並不工作,但那個年代的想法我正在嘗試做什麼。在Java中,這將是實現它的方法。我試着用Google搜索我的問題,但我沒有遇到任何明確的答案。

+0

當你在,也許也看矢量。更易於使用。因爲現在getVehicles的調用者不知道數組的長度。 – RvdK

+0

使用std :: vector - 我第一次輸入那個今天。真的需要有一組標準簡單答案的網頁。使用std :: vector,不要返回當地人的地址等。 – pm100

回答

21

也許在這種情況下最好使用矢量,但這不是問題的正確答案。它不起作用的原因是變量測試只存在於你的函數的範圍內。 所以你必須自己管理內存。這裏是一個例子:

string* getNames() { 
string* names = new string[3]; 
names[0] = "Simon"; 
names[1] = "Peter"; 
names[2] = "Dave"; 

return names; 
} 

在這種情況下,你會返回堆中位置的指針。堆中的所有內存必須手動釋放。所以現在你的工作是刪除內存,如果你不再需要它:

delete[] names; 
+2

現在,我該如何找到返回數組的長度? – thefourtheye

+0

謝謝,這解決了我的問題!,我試圖解決這個問題幾個小時,我的問題是我聲明字符串*名稱靜態而不是動態。 – mp19uy

+1

如果問題是關於如何實現與Java相同的問題,這並不回答問題。這段代碼沒有提供Java提供的垃圾回收,字符串不是unicode等等。返回一個動態分配的字符串數組在C++中從來不是正確的事情(除非你有一個經過驗證的特定情況)。如果你想讓Java使用Java ......如果你想讓C++使用C++。用C++編寫Java代碼是一個非常可疑的(如果不是簡單的)愚蠢的方法。 – 6502

6

使用std::vector<std::string>。處理比C式陣列要容易得多。

#include <string> 
#include <vector> 

... 

std::vector<std::string> Config::getVehicles() 
{ 
    std::vector<std::string> data; 
    data.push_back("hello"); 
    ... 
    return data; 
} 

查看標準庫中的其他容器,它們幾乎總是比C++中的普通數組更好的選擇。

如果您getVehicles方法不改變Config對象的狀態,可考慮將其const

std::vector<std::string> Config::getVehicles() const { ... } 
+0

這不會回答這個問題。 – GreySage

8

在C++中你不使用數組,但std::vector實例。 C++中的數組必須具有編譯時固定長度,而std::vector實例可以在運行時更改其長度。

std::vector<std::string> Config::getVehicles() 
{ 
    std::vector<std::string> test(5); 
    test[0] = "test0"; 
    test[1] = "test1"; 
    test[2] = "test2"; 
    test[3] = "test3"; 
    test[4] = "test4"; 
    return test; 
} 

std::vector還可以動態地擴展,所以在C++程序,你會發現更多的時候像

std::vector<std::string> Config::getVehicles() 
{ 
    std::vector<std::string> test; // Empty on creation 
    test.push_back("test0"); // Adds an element 
    test.push_back("test1"); 
    test.push_back("test2"); 
    test.push_back("test3"); 
    test.push_back("test4"); 
    return test; 
} 

動態分配的std::string陣列在技術上是可行的,但一個可怕的想法在C++(例如C++不提供Java所擁有的垃圾收集器)。

如果你想用C++進行編程,然後grab a good C++ book,並閱讀它覆蓋首先...編寫C++的Java代碼是一個災難的祕訣,因爲儘管表面支撐相似,但語言在很多方面是非常不同的根本的方法。