web-dev-qa-db-fra.com

C ++ passer une chaîne

Question rapide probablement évidente.

Si j'ai:

void print(string input)
{
  cout << input << endl;
}

Comment puis-je l'appeler ainsi:

print("Yo!");

Il se plaint que je passe en char *, au lieu de std :: string. Existe-t-il un moyen de le transtyper dans l'appel? Au lieu de:

string send = "Yo!";
print(send);

Merci.

33
Josh

Vous pouvez écrire votre fonction pour prendre un const std::string&:

void print(const std::string& input)
{
    cout << input << endl;
}

ou un const char*:

void print(const char* input)
{
    cout << input << endl;
}

Les deux façons vous permettent de l'appeler comme ceci:

print("Hello World!\n"); // A temporary is made
std::string someString = //...
print(someString); // No temporary is made

La deuxième version nécessite que c_str() soit appelée pour std::string S:

print("Hello World!\n"); // No temporary is made
std::string someString = //...
print(someString.c_str()); // No temporary is made
48
In silico

Vous devriez pouvoir appeler print ("yo!") Car il existe un constructeur pour std :: string qui prend un caractère const *. Ces constructeurs à argument unique définissent des conversions implicites de leurs aguments vers leur type de classe (sauf si le constructeur est déclaré explicite, ce qui n'est pas le cas pour std :: string). Avez-vous réellement essayé de compiler ce code?

void print(std::string input)
{
    cout << input << endl;
} 
int main()
{
    print("yo");
}

Il compile bien pour moi dans GCC. Cependant, si vous déclarez print comme ceci void print(std::string& input) alors il ne pourra pas être compilé car vous ne pouvez pas lier une référence non const à un temporaire (la chaîne serait un temporaire construit à partir de "yo")

7
Davis King

Eh bien, std::string Est une classe, const char * Est un pointeur. Ce sont deux choses différentes. Il est facile de passer de string à un pointeur (car il en contient généralement un qu'il peut simplement renvoyer), mais dans l'autre sens, vous devez créer un objet de type std::string.

Ma recommandation: les fonctions qui prennent des chaînes constantes et ne les modifient pas devraient toujours prendre const char * Comme argument. De cette façon, ils fonctionneront toujours - avec des littéraux de chaîne aussi bien qu'avec std::string (Via une c_str()) implicite.

6
EboMike
print(string ("Yo!"));

Vous devez faire un (temporaire) std::string objet hors de lui.

5
svens

La façon la plus évidente serait d'appeler la fonction comme ceci

print(string("Yo!"));
4
Fiktik

Faites en sorte que votre fonction accepte un const std::string& Au lieu d'une sous-valeur. Non seulement cela évite la copie et est donc toujours préférable lors de l'acceptation de chaînes dans des fonctions, mais cela permet également au compilateur de construire un std::string Temporaire à partir du char[] Qui vous le donnez. :)

Il suffit de le convertir en un caractère const *. print ((const char *) "Yo!") fonctionnera très bien.

1
Ron Tackaberry