c++ - float - strtof
C++ pasar una cadena (7)
Pregunta rápida, probablemente obvia.
Si tengo:
void print(string input)
{
cout << input << endl;
}
¿Cómo lo llamo así?
print("Yo!");
Se queja de que estoy pasando char *, en lugar de std :: string. ¿Hay una forma de encasillarlo, en la convocatoria? En lugar de:
string send = "Yo!";
print(send);
Gracias.
Asegúrese de que su función acepte const std::string&
lugar de by-value. Esto no solo evita la copia y, por lo tanto, siempre es preferible al aceptar cadenas en funciones, sino que también permite al compilador construir una std::string
temporal std::string
del char[]
que le está dando. :)
Bueno, std::string
es una clase, const char *
es un puntero. Esas son dos cosas diferentes. Es fácil pasar de una string
a un puntero (ya que normalmente contiene uno que simplemente puede devolver), pero para la otra forma, necesita crear un objeto de tipo std::string
.
Mi recomendación: las funciones que toman cadenas constantes y no las modifican siempre deben tomar const char *
como argumento. De esa manera, siempre funcionarán, tanto con literales de cadena como con std::string
(a través de un c_str()
implícito).
Debería poder llamar a print ("yo!") Ya que hay un constructor para std :: string que tiene un carácter constante *. Estos constructores de argumento único definen las conversiones implícitas de sus documentos a su tipo de clase (a menos que el constructor se declare explícito, lo que no es el caso de std :: string). ¿Realmente has intentado compilar este código?
void print(std::string input)
{
cout << input << endl;
}
int main()
{
print("yo");
}
Se compila bien para mí en GCC. Sin embargo, si declara impresión como esta void print(std::string& input)
, no se compilará, ya que no puede enlazar una referencia no constante a una temporal (la cadena se construirá a partir de "yo").
La forma obvia sería llamar a la función como esta
print(string("Yo!"));
Puedes escribir tu función para tomar una const std::string&
:
void print(const std::string& input)
{
cout << input << endl;
}
o una const char*
:
void print(const char* input)
{
cout << input << endl;
}
Ambas formas te permiten llamarlo así:
print("Hello World!/n"); // A temporary is made
std::string someString = //...
print(someString); // No temporary is made
La segunda versión requiere que se c_str()
para std::string
s:
print("Hello World!/n"); // No temporary is made
std::string someString = //...
print(someString.c_str()); // No temporary is made
Sólo tienes que lanzarlo como un const char *. print ((const char *) "Yo!") funcionará bien.
print(string ("Yo!"));
Necesitas hacer un objeto std::string
fuera de él (temporal).