[C con Clase] Error ejecucion - Patron Factory Method

Davidson, Steven srd4121 en njit.edu
Lun Jun 1 17:35:35 CEST 2020


Hola Jesse,

Esta vez creé un proyecto nuevo y efectivamente hay un error. Creo que la
primera vez alteré algunas líneas de código sin darme cuenta y lo di todo
por bueno. Disculpe mi torpeza.

El error está en 'PizzaFactory::createPizza()'. Escribe,

...
case HamMushroom:
            return unique_ptr<HamAndMushroomPizza>();

Esto sólo crea el objeto 'unique_ptr<HamAndMushroomPizza>' pero no el
objeto 'HamAndMushroomPizza'. Esto se debe hacer explícitamente con 'new' o
si lo prefiere con la plantilla 'make_unique'. Esto es,

return unique_ptr<HamAndMushroomPizza>( new HamAndMushroomPizza );

O con 'make_unique',

return unique_ptr<HamAndMushroomPizza>(
std::make_unique<HamAndMushroomPizza>() );

Ahora el objeto 'unique_ptr<HamAndMushroomPizza>' apunta a un objeto
instanciado con memoria dinámicamente adjudicada.

Debería realizar este cambio similar a los otros casos para crear objetos
de las otras dos clases.


Espero que ahora sí funcione todo.

Steven


On Tue, May 26, 2020 at 3:22 PM jesse <jessesazo en yahoo.com> wrote:

> Gracias Steven
>
> Pero no funciona, a lo mejor es algo que tengo que modificar en el Eclipse
>
> El mensaje de error es el siguiente
>
> $ ./udemy-pdd
> Segmentation fault (core dumped)
>
> Y el error ocurre justo en el cout de pizza->getPrice();
>
> void pizza_information(PizzaFactory::enumPizzaType  ept)
> {
>     unique_ptr<IPizza> pizza = PizzaFactory::createPizza(ept);
>
>     cout << "Price of " << ept ;
>     cout << " is " << pizza->getPrice();
>     cout << std::endl;
> }
>
> Gracias, again, por tu ayuda
>
> Jesse
> On 25/5/20 18:59, Davidson, Steven wrote:
>
> Hola Jesse,
>
> Creé mi propio código de ejemplo para probar el código presentado. No tuve
> muchos problemas. Luego, usé sus códigos fuente sin problemas. Intente
> recompilar todo el proyecto y si lo está haciendo para la versión de
> depuración (debug), cambie a la versión de lanzamiento (release).
>
> Espero que esto ayude.
>
> Steven
>
>
> On Mon, May 25, 2020 at 10:26 AM jesse <jessesazo en yahoo.com> wrote:
>
>> Buenas a todos
>>
>> Estoy probando patrones. Estoy con el de creacion Factory Method y tengo
>> un error
>>
>> Tengo la siguiente estructura
>>
>> IPizza <== PizzaFactory --> udemy-pddcl
>> +-> DeluxePizza
>> +-> HamAndMushroomPizza
>> +-> HawaiianPizza
>>
>> He creado una clase virtual / interface: IPizza
>>
>> #ifndef IPIZZA_H_
>> #define IPIZZA_H_
>> class IPizza {
>> public:
>>       IPizza();
>>       virtual ~IPizza();
>>       virtual int getPrice() const = 0;
>> };
>> #endif /* IPIZZA_H_ */
>>
>> Esta interface es implementada por Deluxe, Hawaiian y HamMushroom Pizza,
>> modificando el comportamiento en el metodo getPrice
>>
>> La clase PizzaFactory crea objetos de lo mencionado anteriormente, en
>> funcion al parametro enumPizzaType
>>
>> class PizzaFactory {
>> public:
>>       enum enumPizzaType {
>>           HamMushroom,
>>           Deluxe,
>>           Hawaiian
>>       };
>>       static unique_ptr<IPizza> createPizza(enumPizzaType ept) ;
>> };
>>
>> Pero cuando se invoca a la creacion del tipo de pizza, la linea del cout
>> que esta comentada, arroja un error del tipo "Segmentation fault (core
>> dumped)"
>>
>> void creFactMeth_Pizza(PizzaFactory::enumPizzaType  ept)
>> {
>>       unique_ptr<IPizza> pizza;    // defino el objeto pizza
>>       pizza = PizzaFactory::createPizza(ept); // dependiendo de
>> parametro ept creo el tipo de piza
>>
>>       cout << "Price of " << ept ;    ok
>>       //cout << " is " << pizza->getPrice();<<-- Error
>>       cout << std::endl;
>> }
>>
>> Agradecere mucho si alguien me puede ayudar.
>>
>> Uso Eclipse y CLion sobre linux. Adjunto fuentes
>>
>>
>> Att
>>
>> Jesse
>>
>>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.nethttp://mail.listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
>
> http://mail.listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20200601/10731c2d/attachment-0001.html>


Más información sobre la lista de distribución Cconclase