yo preferiría bien esto:
std::unique_ptr<Solver> S ( UseDummySolver
? createDummySolver()
: new STPSolver(true) );
Solver& STP = *S;
o esto:
std::shared_ptr<Solver> S ( UseDummySolver
? createDummySolver()
: new STPSolver(true) );
std::shared_ptr<Solver> STP = S;
Tanto evitar un problema con el código que tienes ahí: no necesitamos decidir qué hacer puntero llama al delete
cuando los objetos abandonan el alcance (o, de hecho, recuerda la necesidad de llamar al delete
). En su lugar, solo esperamos hasta que las variables salgan del alcance, entonces el objeto Solver
se elimina automáticamente. STP
es en el primer caso inequívocamente otra forma de acceder al objeto mientras está dentro del alcance, en el segundo caso es un "copropietario" independiente del objeto y ambos punteros pueden reasignarse de forma independiente.
Es un medio * muy feo * de asignar dos variables a la vez. * (quemar código [rs] como este con fuego) * – user7116
Hay muchas razones por las cuales este código simplemente apesta. La parte de doble asignación es solo una de ellas. No usar RAII es otro. –
Sí ... Ni siquiera me di cuenta de que es legal, ¡y nunca antes había visto eso! – steveha