Esto puede ser imposible, pero me preguntaba si era posible evitar que un temporal perdurara más allá de su expresión original. Tengo una cadena de objetos que apuntan a objetos padres, y una función miembro que creará un objeto secundario, un ejemplo simplificado es aquí¿Evita que los temporales prolonguen su vida útil?
class person{
string name;
person * mommy;
public:
person(const string & nam, person * m = 0) : name(nam), mommy(m) {}
person baby(const string & nam){
return person(nam, this);
}
void talk() const{
if (mommy) mommy->talk();
cout << name << endl;
}
};
int main(){
person("Ann").baby("Susan").baby("Wendy").talk(); // fine
const person & babygirl = person("Julie").baby("Laura"); // not fine
babygirl.talk(); // segfault
return 0;
}
La forma en que quiero usar person
es pasarlo a una función, y algo como esto:
void use(const person & p) {
p.talk();
}
use(person("Anna").baby("Lisa"));
Is fine.
Esto funcionará bien siempre que ninguno de los temporales sobreviva más allá de la expresión original, pero si vinculo uno de los temporales definitivos a una referencia constante, sus padres no sobreviven, y obtengo una segfault. Puedo ocultar el constructor de copias y el operador de asignaciones de person
, pero ¿hay alguna manera de evitar este tipo de error? Me gustaría evitar la asignación dinámica si es posible.
@Konrad: irónico; -] – ildjarn
Tenga en cuenta que este código "no está bien" de la misma manera esa escritura 'const int & i = std :: vector (1) [0];' no está "bien". 'vector' no te impide escribir eso, y no necesita hacerlo. La clave aquí es que, debido a que la destrucción de la mamá hace que el bebé quede inutilizable, el bebé es parte de la mamá. Eso es lo que está mal con el diseño, es contrario a la intuición. Está tratando de arreglar eso evitando que exista algo así como un huérfano, lo que podría ser apropiado, pero también debería considerar si los huérfanos deberían tener un comportamiento mejor definido o si lo más obvio es que es algo malo para crear. –
De acuerdo con Steve: esto es solo un mal diseño que muestra.La aparición de un puntero desnudo debería haber revelado que algo no funciona. –