Parcial 2024 - Solución no corresponde con pauta

Parcial 2024 - Solución no corresponde con pauta

de Juan Manuel Rivara De Leon -
Número de respuestas: 3

Hola.

Vengo a señalar que la solución al parcial 2024, específicamente para el ejercicio 3, no corresponde a la pauta del ejercicio, en particular por el hecho de que la letra indica que el método agregarContenido recibe un argumento DTContenido por stack según la letra, pero la solución asume que se recibe un puntero. Consulté específicamente sobre este tema durante el parcial y me informaron que debía asumir que se pasaba por stack como la letra señala. No era posible resolver el problema en las condiciones de la letra con los temas vistos en el curso, ya que no es posible hacer el dynamic_cast si el argumento no se pasa por una referencia.

En respuesta a Juan Manuel Rivara De Leon

Re: Parcial 2024 - Solución no corresponde con pauta

de Matias Esmoris -
Hola Juan,

La sintaxis de punteros (*) es de C++. En UML no es explícito si tiene que ser un puntero o no (decisión de implementación). En el caso de los data values, pueden serlo o no.

Como bien decís dynamic_cast es una plantilla que como parámetro debe recibir un puntero (puede que haya alguna alternativa pero no se usa ninguna alternativa en este curso). Para obtener un puntero hacia un tipo a partir de una variable de ese tipo podés usar el operador &.

Saludos
En respuesta a Matias Esmoris

Re: Parcial 2024 - Solución no corresponde con pauta

de Juan Manuel Rivara De Leon -
Hola Matías.

Entiendo que desde el punto de vista de diseño la opción es flexible. Sin embargo los DCD estaban dados, y es la primera vez que escucho que la firma del DCD no se corresponde necesariamente con la firma de la implementación. Durante todos los monitoreos se hizo énfasis en que los DCD + diagramas de comunicación formaban prácticamente una colaboración de pseudocódigo de la implementación.

Sobre la utilización del operador de dirección (&), es correcto que se puede utilizar dynamic_cast en ese caso pero es inútil: el datavalue en stack se pasa por copia, por lo que va a ser siempre del tipo que la firma indica - el argumento de la subclase se castea implícitamente a la superclase al realizar la copia, y la variable sobre la que se copia es del tipo de la superclase.

Muestra minimal (si lo que mencionas funcionara debería imprimir el valor "10" a terminal, pero no imprime nada):

#include <iostream>

class Superclass {
public:
virtual ~Superclass() {};
};

class Subclass: public Superclass {
public:
int val = 0;
};

void sp_method(Superclass sp) {
Subclass* sb = dynamic_cast<Subclass*>(&sp);
if (sb != NULL) std::cout << sb->val << std::endl;
};

int main() {
Subclass sb;
sb.val = 10;
sp_method(sb);
return 0;
};
En respuesta a Juan Manuel Rivara De Leon

Re: Parcial 2024 - Solución no corresponde con pauta

de Matias Esmoris -
Hola Juan,

UML es un lenguaje de modelado con su propia sintaxis. No tiene una representación para los punteros o al menos, no vemos ninguna en este curso y claramente hay firmas que requieren punteros.

Lo otro que mencionas es cierto. Si se utiliza el pasaje por valor de Superclass en tu ejemplo, se utiliza el constructor por copia de la clase Superclass, para mantener el valor original se necesita utilizar pasaje por referencia o un puntero.

Saludos