TStringList als Rückgabewert einer Funktion.



  • Hallo zusammen,
    ich mache gerade meine ersten Schritte mit BCB.
    Ich habe vorhin versucht eine TStringList als Rückgabewert einer Funktion zu geben. Leider ergab es eine Fehlermeldung.
    Sorry das ich so dumm frage. Aber ich habe noch kaum Ahnung.
    Was habe ich falsch gemacht?

    Hier die Funktion:

    TStringList TForm1::LoginInfo(void)
    {
    TStringList* config = new TStringList;
    
    .
    .
    .
    
    config->Add(user);
    config->Add(pass);
    
    return (config);
    }
    

    Hier der Funktionsaufruf:

    TStringList* login = new TStringList;
    login = LoginInfo();
    

    Hier die Fehlermeldung:

    [C++ Error] Unit1.cpp(331): E2034 Cannot convert 'TStringList' to 'TStringList *'
    [C++ Warning] Unit1.cpp(348): W8004 'login' is assigned a value that is never used
    


  • Hallo,

    der Compiler sagt Dir eigentlich ganz gut, was falsch ist.

    [C++ Error] Unit1.cpp(331): E2034 Cannot convert 'TStringList' to 'TStringList *'
    

    Von welchem Typ ist login und welchen Typ gibt Dir LoginInfo() zurück?

    Gruß

    Alexander



  • Hallo

    TStringList* TForm1::LoginInfo() // Pointer zurückgeben, kein Parameter
    {
    TStringList* config = new TStringList;
    ...
    config->Add(user);
    config->Add(pass);
    return config; // return ist keine Funktion, extra Klammern hier sind C-Style
    }
    
    TStringList* login = LoginInfo(); // Speicherreservierung übernimmt die Funktion
    ... // benutzen
    delete login;
    

    Allerdings halte ich das diese Variante für sauberer, denn hier ist erstens die Speicherverwaltung an einem Platz und zweitens könnte man theoretisch beliebige TStrings-Objekte übergeben

    void TForm1::LoginInfo(TStrings* config) 
    {
    config->Clear();
    ...
    config->Add(user);
    config->Add(pass);
    }
    
    TStringList* login = new TStringList();
    LoginInfo(login); 
    delete login;
    

    bis bald
    akari



  • Danke für die Hilfe!



  • In die Funktion sollte vielleicht noch ein Null-Test für config eingebaut werden. Weiter wäre hier noch die Verwendung von auto_ptr oder boost::shared_ptr möglich, um auch noch das delete einzusparen.


Anmelden zum Antworten