web-dev-qa-db-ger.com

Gibt das String-Array in der C++ - Funktion zurück

Ich bin neu in C++. Für ein Schulprojekt muss ich eine Funktion erstellen, die ein String-Array zurückgeben kann.

Momentan habe ich dies in meinem Header:

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

Offensichtlich funktioniert das nicht, aber das ist die Idee dessen, was ich versuche. In Java wäre dies der Weg, dies zu tun. Ich habe versucht, mein Problem zu googeln, aber ich habe keine eindeutigen Antworten erhalten.

15
sn0ep

Vielleicht ist es besser, in diesem Fall einen Vektor zu verwenden, dies ist jedoch keine richtige Antwort auf die Frage. Der Grund, warum es nicht funktioniert, ist, dass der Variablentest nur im Funktionsumfang Ihrer Funktion vorhanden ist. Sie müssen also den Speicher selbst verwalten. Hier ist ein Beispiel:

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

 return names;
}

In diesem Fall geben Sie einen Zeiger der Position im Heap zurück. Der gesamte Speicher im Heap muss manuell freigegeben werden. Nun ist es Ihre Aufgabe, den Speicher zu löschen, wenn Sie ihn nicht mehr benötigen:

delete[] names;
25
GreenPepper

In C++ verwenden Sie kein Array, sondern eine std::vector-Instanz. Arrays in C++ müssen eine feste Länge der Kompilierzeit haben, während std::vector-Instanzen ihre Länge zur Laufzeit ändern können.

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 kann auch dynamisch wachsen, so dass Sie in einem C++ - Programm häufiger so etwas finden

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

Das dynamische Zuordnen eines Arrays von std::string ist technisch möglich, aber eine schlechte Idee in C++ (zum Beispiel stellt C++ nicht den Garbage-Collector bereit, den Java hat).

Wenn Sie in C++ programmieren wollen, dann schnappen Sie sich ein gutes C++ - Buch und lesen Sie zuerst die ersten Schritte. Das Schreiben von Java-Code in C++ ist ein Rezept für eine Katastrophe, da die Sprachen trotz der oberflächlichen Klammern ähnlich sind. sind in vielerlei Hinsicht sehr unterschiedlich.

12
6502

Verwenden Sie einen std::vector<std::string> . Es ist viel einfacher, mit Arrays im C-Stil umzugehen.

#include <string>
#include <vector>

...

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

Schauen Sie sich die anderen Container in der Standardbibliothek an. Sie sind fast immer die bessere Wahl als einfache Arrays in C++.

Wenn Ihre getVehicles-Methode den Status des Config-Objekts nicht ändert, sollten Sie dies als const festlegen:

std::vector<std::string> Config::getVehicles() const { ... }
6
Mat

Versuche dies

#include <iostream>
#include <string>

using namespace std;

string * essai()
    {
    string * test = new string[6];
    test[0] = "test0";
    test[1] = "test1";
    test[2] = "test2";
    test[3] = "test3";
    test[4] = "test4";
    cout<<"test et *test\t"<<&test<<' '<<*(&test)<<'\n';
    return test;
    }

main()
    {
    string * toto;
    cout<<"toto et *toto\t"<<&toto<<' '<<*(&toto)<<'\n';
    toto = essai();
    cout<<"**toto\t"<<*(*(&toto))<<'\n';
    cout<<"toto\t"<<&toto<<' '<<*(&toto)<<'\n';
    for(int i=0; i<6 ; i++)
        {
        cout<<toto[i]<<' '<<&toto[i]<<'\n';
        }
    }

Zum Beispiel in meinem Computer ist das Ergebnis

toto et *toto   0x7ffe3a3a31b0 0x55dec837ae20
test et *test   0x7ffe3a3a3178 0x55dec9ddd038
**toto  test0
toto    0x7ffe3a3a31b0 0x55dec9ddd038
test0 0x55dec9ddd038
test1 0x55dec9ddd058
test2 0x55dec9ddd078
test3 0x55dec9ddd098
test4 0x55dec9ddd0b8
 0x55dec9ddd0d8

Adressen und Inhalt von Adressen zu erhalten, könnte Ihnen helfen zu verstehen, dass ein Array in C++ wirklich sehr rudimentär ist: Es bietet keine Methoden und Sie könnten auf einen Index zugreifen, ohne Speicher zuzuordnen (der Wert 6 in der Schleife). Ihr erstes Beispiel zeigen eine direkte Zuordnung eines lokalen Arrays (Test) an, sodass Sie es nicht zurückgeben können (das lokale Array stirbt). In diesem Beispiel stirbt auch die lokale Variable. Es gibt jedoch immer eine Variable, die auf diesen Teil des zugewiesenen Speichers zugreift. die Funktion und dann die Variable, die das Ergebnis der Funktion erhalten, so dass der Variablentest nach dem Aufruf der Funktion leer ist, der Speicher jedoch noch belegt ist. Grüße.

0