Dev - C++ - necesito ayuda sobre lista de clases

   
Vista:

necesito ayuda sobre lista de clases

Publicado por Ryuuzuzke (1 intervención) el 18/06/2017 23:28:42
hola, que tal?
Escribo para consultar sobre un tema en particular de las clases y es, tener una lista de clases heredadas. les comento, en un ejercicio tengo una clase alumno con datos en general (nombre, apellido,dni) y 3 clases derivadas las cuales son alumno_normal, alumno_vocacional y alumno_libre donde tengo la cantidad de exámenes que tienen cada uno (que dependiendo del tipo de alumno son mas exámenes parciales, o menos)
Ademas tengo otra clase relacionada llamada curso. en esta ultima debo de tener un máximo de 30 alumnos, que son una combinación de cualquiera de los 3 tipos antes indicados.
mi problema esta acá. ¿como seria la forma correcta y eficiente de tener la lista de alumnos dentro de esta clase?
probé creando un vector alumno *a[30], es decir un vector puntero de tipo alumno base, pero al hacer esto no puedo cargar las notas de los alumnos, ya que el método cargar nota () (que trate de hacerlo virtual) no recibe los parámetros, y estos parámetros son distintos para cada tipo de alumno por lo que no me es posible asignarlos en la clase base. (descarte esta opción, que parecía la mejor).
por otro lado pensé en otras opciones, las cuales son: tener 3 vectores estáticos de 30 alumnos cada uno (poco eficiente) o en su defecto tener 3 vectores dinámicos, y preguntar la cantidad de alumnos que existen de cada tipo al usuario (pero dudo que sea la forma correcta de realizar el ejercicio) y por ultimo tener una lista enlazada simple de alumnos, pero no estoy seguro que el ejercicio pida esto (en otras palabras creo que estaría incorrecto realizar esto).
¿cual creen que seria la forma correcta de tener un listado de 30 Alumnos dentro de la clase Curso, independientemente del tipo de alumno que sean?
muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

necesito ayuda sobre lista de clases

Publicado por agustin (522 intervenciones) el 19/06/2017 00:25:40
Lo único que se me ocurre que podrias hacer es crear un array de punteros de tipo unsigned long por ejemplo, luego reservas memoria para cada clase que corresponda con lo que cada puntero apuntaría al tipo deseado de clase derivada y con ello tendrías un array de punteros con clases de distinto tipo sin problemas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos Luis

necesito ayuda sobre lista de clases

Publicado por Carlos Luis riveroreyes@hotmail.com (19 intervenciones) el 20/06/2017 18:13:09
Yo lo realizaría de la siguiente forma, utilizando tu idea de las funciones virtuales; ya que no podemos utilizar la librería STD.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <string>
 
using namespace std;
 
class Alumno{
	public:
		Alumno(string nombre, string apellido, string dni){
			this->nombre = nombre;
			this->apellido = apellido;
			this->dni = dni;
		}
		virtual void asignarNota(int nota){}
		virtual int getNota(int i){return 0;}
	protected:
		string nombre, apellido, dni;
};
 
class AlumnoNormal: public Alumno{
	public:
		AlumnoNormal(string nombre, string apellido, string dni) : Alumno(nombre, apellido, dni){
			contador = 0;
			for(int i = 0; i < 50 ; i++)
				notasNormal[i] = 0;
		}
		void asignarNota(int nota){
			if(contador < 50)
				notasNormal[contador++] = nota;
		}
		int getNota(int i){
			return 	notasNormal[i];
		}
	protected:
		int notasNormal[50];
		int contador;
};
 
class AlumnoVocacional: public Alumno{
	public:
		AlumnoVocacional(string nombre, string apellido, string dni) : Alumno(nombre, apellido, dni){
			contador = 0;
			for(int i = 0; i < 50 ; i++)
				notasVocacional[i] = 0;
		}
		void asignarNota(int nota){
			if(contador < 50)
				notasVocacional[contador++] = nota+ (int)(nota*0.10);
		}
		int getNota(int i){
			return 	notasVocacional[i];
		}
	protected:
		int notasVocacional[50];
		int contador;
};
 
int main()
{
 
	Alumno* a[30];
	for(int i = 0; i < 30 ; i++)
		a[i] = NULL;
 
	a[0] = new AlumnoNormal("Carlos","Rivero","6297076");; //...Primer alumno (Normal)
	a[1] = new AlumnoVocacional("Jesus","Rivero","10526345"); //...Segundo alumno (Vocacional)
	a[2] = new AlumnoNormal("Alexander","Bautista","30526801"); //...Tercer alumno (Normal)
 
 
	a[0]->asignarNota(10); //...Asignar nota 0 al alumnno normal
	a[0]->asignarNota(20); //...Asignar nota 1 al alumnno normal
 
	a[1]->asignarNota(10); //...Asignar nota 0 al alumnno vocacional
	a[1]->asignarNota(20); //...Asignar nota 1 al alumnno vocacional
	a[1]->asignarNota(30); //...Asignar nota 2 al alumnno vocacional
 
	cout << "NOTAS DEL ALUMNO NORMAL UBICADO EN LA POSICION 0\n";
	cout << "================================================\n";
	for(int i = 0; i < 50 ; i++)
		cout << a[0]->getNota(i) << " ";
 
	cout << "\n\n";
 
	cout << "NOTAS DEL ALUMNO VOCACIONAL UBICADO EN LA POSICION 1\n";
	cout << "================================================\n";
	for(int i = 0; i < 50 ; i++)
		cout << a[1]->getNota(i) << " ";
 
	cout << "\n\n";
 
	cout << "NOTAS DEL ALUMNO NORMAL UBICADO EN LA POSICION 2\n";
	cout << "================================================\n";
	for(int i = 0; i < 50 ; i++)
		cout << a[2]->getNota(i) << " ";
 
	for(int i = 0; i < 30 ; i++)
		if(a[i] != NULL)
			delete a[i];
 
	return 0;
}


funcionesVirtuales

Espero haber podido ayudar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar