Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] toString en relacion agregacion?

Estas en el tema de toString en relacion agregacion? en el foro de C/C++ en Foros del Web. Hola, Tengo una clase Rector y una Escuela... Como implemento el toString? Pense en hacer que el toString de Escuela recibiera por parametro un Rector, ...
  #1 (permalink)  
Antiguo 29/10/2014, 09:54
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 1 mes
Puntos: 0
toString en relacion agregacion?

Hola,
Tengo una clase Rector y una Escuela... Como implemento el toString?
Pense en hacer que el toString de Escuela recibiera por parametro un Rector, pero eso ya seria dependencia no?
Tambien intente al final del tostring poner s<<Rector::toString() para llamar el toString de el pero me da error

Ademas el problema dice, "construya el main que le permita tener claridad del uso de la relación", que quieren decir con eso? sera la forma en que se destruyen los objetos?


Código:
class Rector{
private:
	string nom_rector;
	string periodo;
public:
        string toString(){
                 stringstream s;
		 s<<"Nombre del rector: "<<nom_rector<<endl;
		 s<<"Perido: "<<periodo<<endl;
		 return s.str();
}
};


/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

class Escuela{
private:
	string nombre_escuela;
	int capacidad;
	Rector *rec;  //implementación de la relación
public:
string toString(Rector *r){
     stringstream s;
		s<<"Nombre de la Escuela: "<<nombre_escuela<<endl;
		s<<"Capacidad: "<<capacidad<<endl;
		s<<r->toString(); //hasta ahora esta es la unica forma que me ha funcionado
		return s.str();
}
};

Última edición por newb; 29/10/2014 a las 10:01
  #2 (permalink)  
Antiguo 29/10/2014, 10:09
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: toString en relacion agregacion?

"Escuela" tiene un puntero a un objeto de tipo "Rector". No hay nada extraño en llamar a "Rector::toString" desde "Escuela". Eso sí, dado que se trata de un puntero no estaría de más asegurarse de que el puntero no apunta a "null".

Código C++:
Ver original
  1. class Escuela
  2. {
  3.   private:
  4.     string nombre_escuela;
  5.     int capacidad;
  6.     Rector *rec;  //implementación de la relación
  7.  
  8.   public:
  9.     string toString( )
  10.     {
  11.       stringstream s;
  12.       s << "Nombre de la Escuela: "<<nombre_escuela<<endl;
  13.       s << "Capacidad: "<<capacidad<<endl;
  14.       if ( rec != nullptr )
  15.         s << rec->toString();
  16.  
  17.       return s.str( );
  18.     }
  19. };

Hablando de "null", no lo pones en el código así que no se si está implementado... en el constructor de "Escuela", si no se le pasa ningún objeto de tipo "Rector", el puntero interno debería apuntar a "null".

Editado: Para responder a la duda del main sería recomendable tener las dos clases completas.
  #3 (permalink)  
Antiguo 29/10/2014, 10:43
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: toString en relacion agregacion?

Si hago lo de Rector::toString me da este error: una referencia de miembro no estatico debe ser relativa a un objeto especifico

Rector:
Código:
#ifndef RECTOR_H
#define RECTOR_H
#include<string>
#include<sstream>
#include <iostream>
using namespace std;

class Rector{
private:
	string nom_Rector;
	string periodo;
public:
	Rector () {
		nom_Rector="";
		periodo="";
		cout<<"Se ha creado un nuevo Rector"<<endl; }
	~Rector() {cout<<"Se ha destruido Rector"<<endl;  }
	void setNom_Rector(string n) { this->nom_Rector= n; }
	string getNom_Rector() { return (this->nom_Rector); }
	void setPeriodo(string x) { this->periodo= x; }
	string getPeriodo() { return this->periodo; }
// defina el método toString()
	string toString(){
		stringstream s;
		s<<"Nombre del Rector: "<<nom_Rector<<endl;
		s<<"Perido: "<<periodo<<endl;
		return s.str();
	}
};
#endif

Escuela:
Código:
#ifndef ESCUELA_H
#define ESCUELA_H
#include "Rector.h"
using namespace std;
class Escuela{
private:
	string nombre_Escuela;
	int capacidad;
	Rector *rect;  //implementación de la relación
public:	
	Escuela() { 
		cout<<"Se ha creado una Escuela"<<endl; 
	}
	Escuela(string nombre, string ubicacion, int capacidad)
	{
		this->nombre_Escuela= nombre;
		this->capacidad=capacidad;
		cout<<"Se ha creado un Escuela"<<endl;
	}
	string getNombre_Escuela(){ 
		return this->nombre_Escuela; 
	}
	int getcapacidad(){ 
		return this->capacidad; 
	}
	Rector* getRector () { 
		return (this->rect); 
	}
    	void  setNombre_Escuela( string n){ 	
		this->nombre_Escuela= n; 
	}
	void  setcapacidad( int c){ 	
		this->capacidad= c; 
	}
	void setRector (Rector* p) {
		this->rect=p; 
	}
	~Escuela() {cout<<"Se ha destruido "<<nombre_Escuela<<endl;}

string toString(){
		stringstream s;
		s<<"Nombre de la Escuela: "<<nombre_Escuela<<endl;
		s<<"capacidad: "<<capacidad<<endl;
		s<<Rector::toString();
		return s.str();
	}

};

#endif
Edit:
Lo que acabo de hacer es poner el contructor con parametros de escuela como debe ser, le puse un rector y parece que ahi ya se soluciona el problema... En el main creo un rector y luego la escuela con ese rector en el constructor por parametros... ahi si me funciona el toString...
Y con respecto al main, para reflejar la relacion, deberia destruir los objetos por aparte o solo escuela?

Código:
Rector *rec = new Rector();
	rec->setNom_Rector("Manuel");
	rec->setPeriodo("2006-2010");
	Escuela *p = new Escuela("Escuela",50000,rec);
	cout<<p->toString();
	delete p;
	delete rec;

Última edición por newb; 29/10/2014 a las 10:55
  #4 (permalink)  
Antiguo 30/10/2014, 01:39
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: toString en relacion agregacion?

Cita:
Iniciado por newb Ver Mensaje
Si hago lo de Rector::toString me da este error: una referencia de miembro no estatico debe ser relativa a un objeto especifico
Deberías mirar con detenimiento el código que he puesto después de esa explicación. Al poner "Rector::toString" no me refería a que tuvieses que ponerlo literalmente. Lo que venía a decir con "Rector::toString" es que hacer una llamada al método "toString" de la clase "Rector" no es problemática... si "toString" no es estática está claro que no podrás llamarla de forma estática, pero para eso tienes el puntero.

Cita:
Iniciado por newb Ver Mensaje
Y con respecto al main, para reflejar la relacion, deberia destruir los objetos por aparte o solo escuela?
Si el destructor de "Escuela" contempla un delete del puntero a "Rector" únicamente tienes que hacer un delete a "Escuela"... si intentas borrar dos veces el mismo objeto obtendrás un error de ejecución.

Código C++:
Ver original
  1. int main( )
  2. {
  3.   Rector* rector= new Rector( );
  4.   delete rector; // OK
  5.   delete rector; // ERROR: esa memoria ya ha sido liberada.
  6. }

Etiquetas: clase, funcion, int, relacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:37.