Aquí es la forma más sencilla de explicar lo que pasó:
En main() que ha creado una cadena y se la pasó al constructor. Esta instancia de cadena solo existía dentro del constructor. Dentro del constructor, asignó miembro para señalar directamente a esta instancia. Cuando el ámbito dejó el constructor, se destruyó la instancia de cadena y el miembro apuntó a un objeto de cadena que ya no existía. Hacer que Sandbox.member señale una referencia fuera de su alcance no mantendrá esas instancias externas dentro del alcance.
Si desea corregir su programa para mostrar el comportamiento que usted desea, realizar los siguientes cambios:
int main()
{
string temp = string("four");
Sandbox sandbox(temp);
cout << sandbox.member << endl;
return 0;
}
Ahora temp pasará fuera de alcance al final del main() en lugar de al final de el constructor Sin embargo, esta es una mala práctica. Su variable miembro nunca debe ser una referencia a una variable que existe fuera de la instancia. En la práctica, nunca se sabe cuándo esa variable saldrá del alcance.
Lo que recomiendo es definir Sandbox.miembro como const string member;
Esto copiará los datos del parámetro temporal en la variable miembro en lugar de asignar la variable miembro como el parámetro temporal en sí.
Y para más diversión, si hubiera escrito 'tribunal << "La respuesta es:" << Sandbox (cadena() "cuatro") miembro de << endl;', entonces. se garantizaría que funcionara. –
@RogerPate ¿Podría explicar por qué? –
Para alguien curioso, por ejemplo, Roger Pate publicó trabajos porque * string ("four") * es temporal y ese temporal se destruye ** al final de la expresión completa **, por lo que en su ejemplo cuando 'SandBox :: member' es leer, la cadena temporal ** todavía está viva **. – PcAF