Problem mit Array im Headerfile



  • Wieso bekomme ich eine Fehlermeldung,
    wenn ich folgende Definition in ein Headerfile schreibe:

    string[3] splitString(string wert);
    string[] splitString(string wert); geht auch nicht.

    string* splitString(string wert) möchte ich nicht schreiben,
    es muß doch auch anders gehen.

    Hintergrund:
    Ich will einen String in 3 Teilstrings zerlegen
    und die Teilstring zurückgeben.

    Gruß,
    Cold



  • string str[3];
    


  • ColdAsIce schrieb:

    string* splitString(string wert) möchte ich nicht schreiben

    warum nicht? es würde genau das bewirken, was du mit

    string[] splitString(string wert);
    

    intendierst.



  • Konfusius schrieb:

    ColdAsIce schrieb:

    string* splitString(string wert) möchte ich nicht schreiben

    warum nicht? es würde genau das bewirken, was du mit

    Ist schon richtig das er es nicht will, denn wer soll denn das Objekt das sich hinter dem Pointer verbirgt löschen?

    Konfusius schrieb:

    string[] splitString(string wert);
    

    intendierst.

    Ist doch was ganz anderes. Ganz davon abgesehen, das die Strings kopiert werden! 👎

    Ich würde es so machen (hoffe kein Fehler drin):

    std::auto_ptr<std::vector<std::string*> > splitString(std::string wert)
    {
        using namespace std;
        // Vector als Autopointer.
        auto_ptr<vector<string*> > str(new vector<string*>);
    
        // Teil-Strings rein pushen.
        str->push_back(....hier die strings einfügen);
    
        return str;
    }
    


  • Ok,

    ich hab's jetzt wie in der untersten Lösung
    mit einem Vektor gemacht, den ich zurückgebe.
    Aber warum funktioniert das eigentlich nicht mit dem Array???

    Cold



  • Naja, das geht halt einfach nicht. 🙄 Das hier geht ja auch nicht:

    void foo(string[] str);
    

    Als Parameter und auch nicht als Rückgabeparameter kann man keine Arrays übergeben. Muß man dann halt über einen Pointer oder by-Reference machen.



  • string* splitString( string wert)
    

    hat das Problem, dass niemand weiss wie viele Strings sich hinter dem String Pointer verbergen (der OP will ja ein String Array zurückgeben).

    Die auto_ptr Lösung ist unnötig komplex und erfordert, dass bevor der auto_ptr freigegeben wird, jemand die Strings aus dem vector freigibt. Das macht nämlich der Autoptr nicht. Wenn auto_ptr, dann vector<string> nutzen.

    Die einfachste Lösung ist

    vector<string> splitString( const string& wert)
    

    Allerdings kopiert man dabei gewöhnlich den Vector und die Strings, was in manchen Anwendungsfällen zu Performanzproblemen führt.

    Will man die Kopie vermeiden, dann hilft z.B.

    void splitString( const string& wert, vector<string>& result);
    

    und man vermeidet wieder die Pointer.

    BTW, wenn immer 3 Strings zurückkommen müssen, solltest Du überlegen, ob es nicht sinnvoll ist, diese zu benennen:

    void splitName( const string& completeName, string& andrede, string& vorname, string& name);
    


  • niemand schrieb:

    Die auto_ptr Lösung ist unnötig komplex und erfordert, dass bevor der auto_ptr freigegeben wird, jemand die Strings aus dem vector freigibt. Das macht nämlich der Autoptr nicht. Wenn auto_ptr, dann vector<string> nutzen.

    Also auto_ptr ist keines Falls komplex. klar, man muß ein paar Tasten mehr drücken um den Typ zu bestimmen. Und?

    Aber mit dem vector<string> anstatt vector<string*> gebe ich dir Recht.



  • kaum dreht man dem forum mal den rücken zu wird auch schon unsinn geposted 😋

    zum glück hat "niemand" mir erspart, auf artchi zu antworten. also, artchi, im prinzip hast du schon recht. in c++ nimmt man besser vektoren anstelle von c-arrays. deinen code solltest du aber nochmal überdenken. du ersetzt einen zeiger durch drei.

    ansonsten sollte sich ColdAsIce besser an den post von "niemand" halten.



  • Die Semantik eines auto_ptr ist doch eher ungewöhnlich und nach meiner Erfahrung für viele C++ Programmierer eher verwirrend.
    Beispiel:
    Die Zeile

    a = b;
    

    wird meistens so interpretiert, dass b unverändert bleibt (und a eine Kopie von b enthält).
    Im Falle des Typs auto_ptr ist b anschliessend ungültig. Das wird doch mal leicht übersehen.
    Ich setze daher auto_ptr selten ein.
    Für weitere "smart-Pointer" siehe z.B. auch http://www.boost.org/libs/smart_ptr/smart_ptr.htm



  • Artchi schrieb:

    Naja, das geht halt einfach nicht. 🙄 Das hier geht ja auch nicht:

    void foo(string[] str);
    

    Als Parameter und auch nicht als Rückgabeparameter kann man keine Arrays übergeben. Muß man dann halt über einen Pointer oder by-Reference machen.

    Nicht ganz. Als Parameter kannst du Arrays schon verwenden, nur nicht als Rückgabewert. Dein Beispiel müsste übrigens wie folgt aussehen

    void foo(string str[]);
    

    Was allerdings als

    void foo(string* str);
    

    interpretiert wird.



  • LOL,

    hätte ja nie gedacht, dass meine einfache Frage solche
    Auswüchse nach sich zieht! *g*

    Ich habe es so ähnlich, wie "niemand" es vorgeschlagen hat,
    gemacht.
    Dachte halt es muß doch gehen, Arrays zurückzugeben,
    in Java geht es ja auch (auch wenn dort natürlich strengenmommen
    nur ein Pointer zurückgegeben wird und man sich um das
    Löschen des Objekts dank Garbage Collector keine Gedanken machen muß).

    Cold


Anmelden zum Antworten