Los requerimientos de cada ejercicio del seminario serán expuestos desde el punto de vista práctico y teórico; es decir, para su exposición, cada equipo se basará en el caso práctico en cuestión para introducir y explicar el elemento teórico requerido. La exposición no es una mera enunciación de código. Preguntas como: ¿Por qué?, ¿Basándose en qué?, ¿Cómo se logra esto en el lenguaje X? entre otras, deben hacerse.
Todos los miembros del equipo deben participar en la solución del ejercicio y estar preparados para exponer todo el trabajo. La persona a exponer se decide el día de la exposición. Quién no esté presente en la exposición de su equipo tiene 0
en la evaluación. (Note que estas notas se promedian y hay distinción entre 0
y 2
).
Implemente una clase vec
para representar vectores algebraicos en C++
(con los elementos disponibles en el lenguaje hasta antes de C++11
(C++0x)
) que cumpla los siguientes requerimientos:
- Definir la clase genérica vec en el tipo de escalar y la cantidad de componentes. e.g.
vec<float, 3> , vec<int, 5>
. - Definir constructores para crear a partir de arrays, copia o por defecto.
- Definir constructor para crear a partir de un valor replicado a todas las componentes.
- La memoria del objeto no puede exceder
sizeof(T) * cantidad_de_componentes
. - Se puede acceder a partir de una función al tamaño del vector. e.g.
vec<float,3> v; ...; v.size(); // devuelve 3
. - Se puede acceder a los componentes de un vector mediante indización. e.g.
v[0] = 4;
. - Se pueden realizar operaciones como + entre vectores de igual tipo y tamaño. e.g.
v1 + v2
. - Para los casos particulares de
vec<T, 2>
yvec<T, 3>
se debe poder acceder a las componentes mediante camposx
,y
yx
,y
,z
respectivamente. e.g.vec<float, 3> v; ...; v[0] = 5
es equivalente av.x = 5
. - Sobrecargar operadores
<<
y>>
para poder utilizar la clase con la salida estándar.
Implemente una clase linked_list
doblemente enlazada en C++
(haciendo uso extensivo de los elementos novedosos en el lenguaje desde C++11
) que cumpla los siguientes requerimientos:
- Definir las clases genéricas
linked_list
ynode
. - Definir miembros de datos necesarios de ambas clases.
- ¿Cuáles son los nuevos elementos introducidos a partir de
C++11
que permiten un manejo más `"inteligente" de la memoria? - ¿Cómo deben inicializarse?
- ¿Cuál es la filosofía en el uso de la memoria defendida por
C++
? - Usar alias para simplificar nombres de tipos.
- ¿Cuáles son los nuevos elementos introducidos a partir de
- Definir los constructores clásicos de
C++(C++0x)
, el constructormove
y las sobrecargas del operador=
.- ¿Qué hace cada uno de ellos? ¿Cuándo se llaman?
- ¿Qué es un
lvalue
y unrvalue
? - Explique
std::move
.
- Definir un constructor que permita hacer
list-initialization
lo más parecido aC#
posible.- Compare la utilización del
{}
v.s()
.
- Compare la utilización del
- Definir un constructor que reciba un
vector<T>
.- Usar
for_each
con expresiones lambda.
- Usar
- Definir el destructor de la clase.
- ¿Hace falta?
- ¿Para qué casos haría falta un puntero crudo (raw pointer)?
- Definir funciones
length
,Add_Last
,Remove_Last
,At
,Remove_At
- Explique
Noexcept
. - Inferencia de tipo en
C++
(auto
,decltype
,decltype(auto)
). Explicar todos, pero no obligatoriamente usarlos.
- Explique
- Crear un puntero a función
Function<R, T...>
que devuelve un valor de tipoR
y recibe un número variable de parámetros de tipoT
.- Definir una función genérica
Map
alinked_list
enT
yR
, que recibe un puntero a función que transforma un elementoT
en unoR
; de manera queMap
devuelve una instancia delinked_list<R>
resultado de aplicar a todos los elementosT
de la lista original la función de transformación. - Crear punteros a funciones usando
alias
. - Crear un puntero a función
Function
que permita cualquier cantidad de parámetros de cualquier tipo.
- Definir una función genérica
Para ello debe abordar los siguientes puntos.
- Genericidad en
C++
basada en templates . Tipos de argumentos. - Definición de arrays en
C++
. - Distintos tipos de constructores en
C++
(defecto y copia).- ¿Qué hace cada uno de ellos?
- ¿Cuándo se llaman?
- Explicar la inicialización de campos.
- ¿Cómo funciona el paso de parámetros cuando se llama a una función?
- ¿Cuándo se deben utilizar parámetros por valor, por puntero o por referencia?
- Constructores con un solo argumento.
- Constructores
explicit
.
- Funciones
inline
yconst
. (Deberá hacerconst
todas las funciones que puedan ser usadasconst
).- Diferencia entre
const T x;
,T const x;
yconst T const x;
.
- Diferencia entre
- Redefinición de operadores
[]
y+
. Tipos de traspasos enC++
. - Especialización de los
templates
. - Tipos union.