2016-07-18 11 views
-2

Ich schreibe einen Passwortgenerator, der in eine Datei lesen und schreiben kann. Ich habe eine Funktion, die eine leere Zeichenfolge annimmt und dann ändert. Die Funktion wie folgt aussehen würde:Einen Zeiger an eine Funktion übergeben und dann in eine andere Funktion einfügen

void password_create(string *passwd) 

Innerhalb dieser Funktion habe ich eine Schreibfunktion aufrufen, die mit dem Kennwort in eine Datei schreibt, würde es in etwa so aussehen:

void write_out(string file_name, string *passwd) 

Dann wird die Gesamt Code sieht wie folgt aus:

void password_create(string *passwd) { 
    *passwd = "something"; 
    write_out(&passwd); 
} 

Die Kompilierung beschwert sich, dass ich nicht std::basic_string<char>**-std::basic_string<char>* umwandeln kann.

Ich bin relativ neu in C++, und dieses Programm dient nur dazu, mich mit der Sprache vertraut zu machen. Ich kann passwd in die write_out() Funktion ohne * oder & übergeben, um einen Zeiger oder eine Referenz ganz gut zu bezeichnen. Es wird mir nicht einen Fehler, wenn ich schreibe:

*passwd = "something"; 
write_out(passwd); 

es nicht den Gesamt Abschluss des Programms nicht beeinflusst, war ich nur neugierig, warum ich diesen Fehler.

+3

TL; DR; Warum nimmst du einen Zeiger auf 'std :: string'? Lieber als Referenz oder nach Wert. –

+1

Wenn die Funktion eine leere Zeichenfolge annimmt, warum braucht sie überhaupt eine Zeichenfolge? –

+1

Bitte geben Sie ein [MCVE] an, das Ihr Problem veranschaulicht. Diese willkürlichen Code-Schnipsel sind nicht hilfreich, um Ihre Frage präzise zu beantworten. –

Antwort

0

keine Zeiger verwenden, in C++ unter Bezugnahme Pass lieber mit:

void password_create(std::string &passwd) { 
    passwrd = "something"; 
    ... 

dann sicher, dass Sie die Zeichenfolge erstellen, wie Sie beabsichtigen:

std::string myString; 
password_create(myString); 

diese Weise werden Sie den Speicher haben Sie erwarten, und Sie müssen sich nicht um Pointer-Semantik kümmern.

2

Die Variable passwd ist bereits ein Zeiger auf eine std::string daher die Adresse es über &passwd verwenden, können Sie etwas von std::string** Art geben - also, wenn write_out einen Parameter des Typs erwartet std::string* aber erhält die std::string** dann wird der Compiler geben Sie ein Fehler, wie du gesehen hast. Also nicht & verwenden, wenn passwd-write_out() vorbei:

write_out(passwd); 

Aber alles, was beiseite, sollten Sie nur die std::string Variablen als Verweis übergeben und nicht durch Zeiger, wie in den Kommentaren und die anderen Antwort erwähnt.

0

Keine Notwendigkeit, Dinge zu komplizieren. Ich sehe nicht, wo Zeiger in diesem Fall überhaupt benötigt werden. Machen Sie einfach eine Funktion, um ein Passwort zu generieren und es zurückzugeben.

#include <string> 
#include <fstream> 

using namespace std; 

string password_create() { 
    return "generated password"; 
} 

void write_password_to_file(string file, string password) { 
    ofstream stream(file); 
    stream << password; 
    stream.close(); 
} 

int main() { 
    auto password = password_create(); 
    write_password_to_file("pathtofile.txt", password); 
    return 0; 
} 
0

Wie in den anderen Antworten erwähnt, sollten Sie tatsächlich nehmen Sie die std::string Parameter durch Verweis anstelle eines Zeigers.


Nun unter der Annahme, dass die write_out() eine Signatur wie

write_out(char* passwd); 

oder

write_out(const char* passwd); 

Sie std::string::operator[]() kann passieren hat:

void password_create(string *passwd) { 
    *passwd = "something"; 
    write_out(&(*passwd)[0]); 
} 
+0

@NathanOliver Korrigiert. –

+0

Sie sollten ['std :: string :: c_str()'] (http://en.cppreference.com/w/cpp/string/basic_string/c_str) anstelle von 'std :: string :: operator [] verwenden 'zB:' write_out (passwd.c_str()); ' –

Verwandte Themen