2011-09-23 12 views
13

Soy nuevo en C++. Para un proyecto escolar, necesito hacer una función que pueda devolver una matriz de cadenas.Regresar conjunto de cadenas en la función C++

Actualmente tengo esto en mi cabecera:

config.hy

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

Obviamente, esto no funciona, pero esa es la idea de lo que intento hacer En Java, esta sería la manera de hacerlo. Intenté buscar en Google mi problema, pero no encontré ninguna respuesta que fuera clara para ser sincera.

+0

Cuando se encuentre, tal vez también vea los vectores. Más fácil de usar. Porque ahora quien llama a getVehicles no conoce la longitud de la matriz. – RvdK

+0

use std :: vector - primera vez que escribí eso hoy.Realmente debe haber un conjunto de páginas web con respuestas estándar simples. Use std :: vector, no devuelva la dirección de los locales, etc. – pm100

Respuesta

21

Quizás sea mejor utilizar un vector en este caso, pero esta no es una respuesta correcta para la pregunta. La razón por la que no funciona es que la prueba de variable solo existe en el alcance de su función. Así que debe administrar la memoria usted mismo. Aquí está un ejemplo:

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

return names; 
} 

En este caso devuelve un puntero de la posición en el montón. Toda la memoria en el montón debe liberarse manualmente. Así que ahora es su trabajo eliminar la memoria, si ya no la necesita:

delete[] names; 
+2

Ahora, ¿cómo puedo encontrar la longitud de la matriz devuelta? – thefourtheye

+0

¡Gracias, esto resolvió mi problema! Estaba intentando resolver este problema durante horas, y mi problema era que estaba declarando la cadena * nombres estáticos en lugar de dinámicos. – mp19uy

+1

Esto no responde a la pregunta si la pregunta es sobre cómo implementar lo mismo que Java. Este código no proporciona la recolección de basura que proporciona Java, las cadenas no son unicode, etc. Nunca es correcto hacer una matriz de cadenas dinámicamente asignada en C++ (a menos que tenga un caso específico comprobado). Si desea que Java use Java ... si desea utilizar C++ C++. Escribir un código Java en C++ es un enfoque muy cuestionable (si no simplemente estúpido). – 6502

6

Utilice un std::vector<std::string>. Es mucho más fácil tratar con arreglos de estilo C.

#include <string> 
#include <vector> 

... 

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

comprobar los otros contenedores en la biblioteca estándar, que son casi siempre una mejor opción que las matrices de civil en C++.

Si su método de getVehicles no cambia el estado del objeto Config, tenga en cuenta lo que es const:

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

Nada de esto responde la pregunta. – GreySage

8

En C++ no se utiliza una matriz, pero una instancia std::vector. Las matrices en C++ deben tener una longitud fija en tiempo de compilación, mientras que las instancias std::vector pueden cambiar su longitud en tiempo de ejecución.

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 también puede crecer de forma dinámica, por lo que en un programa en C++ se encuentra más a menudo algo así como

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

asignar dinámicamente una serie de std::string es técnicamente posible, pero una idea terrible en C++ (por ejemplo, C++ no proporciona el recolector de basura que Java tiene).

Si quieres programar en C++ entonces grab a good C++ book y léelo primero para cubrir ... escribir código Java en C++ es una receta para un desastre porque los idiomas, a pesar de la similitud de los paréntesis superficiales, son muy muy diferentes en muchos formas fundamentales.

Cuestiones relacionadas