Dev - C++ - Acceder a las clases miembro de una clase desde un puntero

   
Vista:

Acceder a las clases miembro de una clase desde un puntero

Publicado por Federico (11 intervenciones) el 07/06/2017 09:31:01
Buenas me preguntaba como acceder a los datos miembro de una clase desde un objeto tipo puntero dentro de un método de la clase, es todo un trabalenguas, se entiende mejor en el código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class RegAlumno{
	private:
 
		double notas [4];
		char apellido_nombre[80];   //Cadena clásica
		double nota_media = 0; //Nota media del alumno
.
.
.
void RegAlumno::CalculaCalificacionesMedias(int num_alumnos, RegAlumno* Alumno[]){
 
	if (num_alumnos > 0){
		for (int i=0; i<num_alumnos; i++){
			Alumno[i]->ObtenerMedia() = Alumno[i]->CalcularMedia();  //Esta línea de código me da error
		}
	}
}


El método obtener media solo retorna la nota_media.


Un saludo,
grasias
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

Acceder a las clases miembro de una clase desde un puntero

Publicado por agustin (522 intervenciones) el 07/06/2017 14:11:43
No entiendo el sentido de lo que deseas hacer. Yo lo haria así:

El archivo del main:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream.h>
#include "Alumnos.h"
//---------------------------------------------------------------------------
 
using namespace std;
 
 
int main(int argc, char* argv[])
{
    int n_alumnos;
 
    cout << "Indica el numero de alumnos: ";
    cin >> n_alumnos;
    Alumnos alumnos(n_alumnos);
    cin.get();
    alumnos.SolicitarDatos();
    alumnos.CalculaCalificacionesMedias();
    alumnos.MostrarCalificacionesMedias();
    return 0;
}
//---------------------------------------------------------------------------

RegAlumno.cpp:
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
#include "RegAlumno.h"
 
using namespace std;
 
RegAlumno::RegAlumno(void)
{
    nota_media=0;
    apellidos_nombre="";
}
//---------------------------------------------------------------------------
 
RegAlumno::~RegAlumno(void)
{
}
//---------------------------------------------------------------------------
 
void RegAlumno::SolicitarNotas(void)
{
    for(int i=0;i<N_NOTAS;i++){
        cout << "Inserte la nota " << i+1 << ": ";
        cin >> notas[i];
    }
}
//---------------------------------------------------------------------------
 
void RegAlumno::SolicitarNombre(void)
{
    cout << "Introduzca apellidos y nombre: ";
    getline(cin,apellidos_nombre);
}
//---------------------------------------------------------------------------
 
void RegAlumno::CalcularMedia(void)
{
    nota_media=0;
 
    for(int i=0;i<N_NOTAS;i++)
        nota_media+=notas[i];
    nota_media/=N_NOTAS;
}
//---------------------------------------------------------------------------
 
double RegAlumno::SolicitarNotaMedia(void)
{
    return nota_media;
}
//---------------------------------------------------------------------------
 
string RegAlumno:: MostrarNombre()
{
    return apellidos_nombre;
}
//---------------------------------------------------------------------------

RegAlumno.h:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef CLASS_REGALUMNO
#define CLASS_REGALUMNO
#include <iostream.h>
#define N_NOTAS 4
 
class RegAlumno
{
	private:
		double notas[N_NOTAS];
		string apellidos_nombre;
		double nota_media;
    public:
        RegAlumno(void);
        ~RegAlumno(void);
        void CalcularMedia();
        void SolicitarNotas(void);
        void SolicitarNombre(void);
        double SolicitarNotaMedia(void);
        string MostrarNombre();
};
#endif
//---------------------------------------------------------------------------

Alumnos.cpp:
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
#include "Alumnos.h"
 
using namespace std;
//---------------------------------------------------------------------------
 
Alumnos::Alumnos(int n)
{
    nAlumnos = n;
    alumnos = new RegAlumno[nAlumnos];
}
//---------------------------------------------------------------------------
 
Alumnos::~Alumnos(void)
{
    delete [] alumnos;
}
//---------------------------------------------------------------------------
 
void Alumnos::SolicitarDatos(void)
{
    for(int i=0;i<nAlumnos;i++){
        alumnos[i].SolicitarNombre();
        cout << "Notas para el alumno: " << endl;
        alumnos[i].SolicitarNotas();
        cin.get();
    }
}
//---------------------------------------------------------------------------
 
void Alumnos::CalculaCalificacionesMedias(void)
{
    for(int i=0;i<nAlumnos;i++)
        alumnos[i].CalcularMedia();
}
//---------------------------------------------------------------------------
 
void Alumnos::MostrarCalificacionesMedias(void)
{
    for(int i=0;i<nAlumnos;i++)
        cout << "Alumno " << alumnos[i].MostrarNombre() << ": " << alumnos[i].SolicitarNotaMedia() << endl;
}
//---------------------------------------------------------------------------

Alumnos.h:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef CLASS_ALUMNOS
#define CLASS_ALUMNOS
#include "RegAlumno.h"
 
class Alumnos
{
    private:
        RegAlumno *alumnos;
        int nAlumnos;
    public:
        Alumnos(int nAlumnos);
        ~Alumnos();
        void CalculaCalificacionesMedias(void);
        void MostrarCalificacionesMedias(void);
        void SolicitarDatos(void);
};
#endif
//---------------------------------------------------------------------------
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Dionicio

re: Acceder a las clases miembro de una clase desde un puntero

Publicado por Dionicio (57 intervenciones) el 07/06/2017 14:50:45
Hay varias cosas que no comprendo muy bien de lo que quieres hacer con el código del método CalculaCalificacionesMedias(int num_alumnos, RegAlumno* Alumno[]) imagino que lo que quieres hacer es obtener las calificaciones medias de un grupo de alumnos. Es mejor pasar el vector de alumnos como un apuntador y es más fácil de manejar, y en vez de que sea un método puede ser una función fuera de la clase para mayor claridad(al menos para mí).

La siguiente línea de código no tiene sentido alguno, porque no estás asignando el resultado de Alumno[i] -> CalcularMedia() a ninguna parte ya que Alumno[i] -> ObtenerMedia() devuelve un resultado obviamente.

1
Alumno[i]->ObtenerMedia() = Alumno[i]->CalcularMedia();

También si vas a definir el método dentro de la misma clase solo necesitas poner simplemente el nombre del método y listo.

La nota_media no puede ser inicializada en la clase de esa manera, la mejor forma es hacerlo en el constructor.
1
double nota_media = 0; //Nota media del alumno
Por ejemplo:
1
2
3
RegAlumno(){
	nota_media = 0.0;
}

Te dejo una ayudita, espero te sirva. Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Miguel Ángel

Acceder a las clases miembro de una clase desde un puntero

Publicado por Miguel Ángel (3 intervenciones) el 08/06/2017 14:55:58
creo que lo que quieres hacer es simplemente en lugar de poner -> debes poner un punto ( . ).
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