Kurze Design Frage



  • Hallo, die Funktion InternetConnect nimmt nur C Strings an wie es scheint.

    Daher meine Frage was ist besser wenn ich es so mache:

    int MyClass :: VerbindeZuServer(std::string srvname, std::string username, std::string password )
    {
    HINTERNET net;
    
    net = InternetOpen(0, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 
    
    	net = InternetConnect( hinternet, srvname.c_str() , INTERNET_DEFAULT_FTP_PORT, username.c_str(), password.c_str(),
    					INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, NULL );
    
    return 0;
    }
    

    Oder wenn ich das so mache:

    int MyClass :: VerbindeZuServer(char* srvname, char* username, char* password )
    {
    HINTERNET net;
    
    net = InternetOpen(0, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 
    
    	net = InternetConnect( hinternet, srvname , INTERNET_DEFAULT_FTP_PORT, username, password,
    					INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, NULL );
    
    return 0;
    }
    

    Mit .c_str(); mache ich ja aus einem C++ String einen C String aber macht das Sinn?

    Oder sollte ich da lieber direkt die C Strings benutzen obwohl ich ja eigentlich in C++ Programmiere.



  • Ersteres ist besser - jedoch ist es sinnvoll die std::string's als const std::string& zu übergeben, so werden sie nicht kopiert.

    std::string's haben gegenüber C-Strings viele Vorteile - suche mal hier im Forum danach.



  • Wenn du nur C-Strings brauchst, dann nimm C-Strings.



  • sdfjse schrieb:

    Wenn du nur C-Strings brauchst, dann nimm C-Strings.

    👍
    Aber trotzdem: Nimm const char*!



  • Komm mal ins IRC cooky :<



  • Okay aber wie gebe ich einen C String richtig ein.

    So stürtzt mir das Programm ab: 😞

    my_class obj;
    char *str=0;
    
    cin>>str;
    obj.VerbindeZuServer ( str,"test","test" );
    


  • CptQuak schrieb:

    Okay aber wie gebe ich einen C String richtig ein.

    Nur weil du einen C String übergibst, heißt das nicht, dass du ihn auch zur Eingabe nutzt. (Da nutzt du lieber std::string) (Zudem hast du das Speicherkonzept wohl überhaupt nicht verstanden..)



  • char *var = "ABC"; // Reserviert mir 3 Byte + 1 Byte Nullterminator
    Im Speicher: [41][42][43][0]
    
    char *var=0; // Zeigt auf gar nichts, var braucht eine Adresse wo es drauf zeigen kann
    

    Das ist doch so richtig oder? Wenn nicht korrigiert micht plz.

    Bsp. 1

    int VerbindeZuServer(const char* srvname, const char* username, const char* password );
    
    int main () 
    {
    std::string var;
    
    cin>>var;
    
    VerbindeZuServer(var.c_str() , "test","test"); // c_str() wird hier einmal aufgerufen
    
    }
    
    int VerbindeZuServer(const char* srvname, const char* username, const char* password )
    {
    InternetConnect( hinternet, servername  , INTERNET_DEFAULT_FTP_PORT, username, password,
    					INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, NULL );
    }
    

    Bsp. 2

    int VerbindeZuServer(std::string srvname, std::string username, std::string password )
    
    int main()
    {
    std::string var;
    
    cin>>var;
    
    VerbindeZuServer(var.c_str() , "test","test"); // c_str() wird hier einmal aufgerufen
    }
    
    int VerbindeZuServer(std::string srvname, std::string username, std::string password )
    {
    
    // Hier wird .c_str() noch 2 weitere male aufgerufen
    InternetConnect( hinternet, servername.c_str()  , INTERNET_DEFAULT_FTP_PORT, username.c_str(), password.c_str(),
    					INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, NULL );
    
    }
    

    Wäre ein Grund Bsp.1 zu benutzen da ich dort im Programm die Funktion .c_str() ja nur insgesamt einmal aufrufe?

    Und in Bsp.2 rufe ich .c_str() ja sogar schon 3 mal auf. (Ich denke mal Bsp.2 kostet auch mehr Zeit in der ausführung )

    Ist das so richtig?



  • Oops sry hab mich bei den Funktionsparametern mit den Namen gerade vertan ... -.-
    (Aber egal das gehört ja jetzt net zum Thema)



  • CptQuak schrieb:

    Das ist doch so richtig oder? Wenn nicht korrigiert micht plz.

    http://www.c-plusplus.net/forum/299061


Anmelden zum Antworten