FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Pasar Registro por Referencia
Buenas:
Quisiera saber como paso un registro por referencia En principio tengo una Clase1 donde creo un tipo dato Registro Código:
class Clase1 { Public: struct Registro { bool Esta; bool Dentro; bool Frio; } typedef Registro TRegistro[15]; TRegistro Reg; } ModificarRegistro( TRegistro &Reg); Tengo Otra Clase2 donde declaro una Variable tipo Reg la cual mando al procedimiento ModificarRegistro de la Clase1 para obtener nuevos datos. Código:
include "Clase1.h" class Clase2 { Public: Clase1::TRegistro *Registros; } CambiarValores Reg() { //iNICIALIZAR for(int i=1;i<15;i++) { (*Registros)[i].Esta =false; (*Registros)[i].Dentro=false; (*Registros)[i].Frio =false; } //Calcular Valores ModificarRegistro(Registros); } |
#2
|
||||
|
||||
Tienes mal planteadas tus clases. Imagino que parte son errores tipográficos.
Te pongo un ejemplo: Código:
class Clase1 { public: struct Registro { bool Esta; bool Dentro; bool Frio; }; typedef Registro TRegistro[15]; TRegistro Reg; }; ModificarRegistro( Clase1::TRegistro &Reg); class Clase2 { public: Clase1::TRegistro Registros; // no declares un puntero sino un objeto. CambiarValores(); }; Clase2::CambiarValores() { //iNICIALIZAR for(int i=0;i<15;i++) { Registros[i].Esta =false; Registros[i].Dentro =false; Registros[i].Frio =false; } //Calcular Valores } ModificarRegistro( Clase1::TRegistro &Reg) { for(int i=0;i<15;i++) { Reg[i].Esta =true; Reg[i].Dentro =true; Reg[i].Frio =true; } } Código:
Clase2 C2; C2.CambiarValores(); ModificarRegistro(C2.Registros); |
#3
|
|||
|
|||
Gracias por contestar, funciona perfectamente.... pero he rizado el rizo y me encuentro en un atolladero...El caso es que la variable Registro la quiero pasar por referencia como parametro en el constructor de la clase,
me explico. Para no crear conflictos he creado una clase comodin en la que declaro la variable registros Código:
Class TComodin { public struct Registro { bool esta; bool Dentro; bool Frio; } typedef Registro TRegistros[15]; } He creado una Clase1 cuyo constructor tendra como parametro una variable pasada por referncia (Registro) y una Clase2 que la LLama. Código:
include "Comodin.h" Class TClase1 { public: _fastcall TClase1(TComponent* Owner,TComodin:TRegistros &Regs) } include "Comodin.h" include "Clase1.h" Class TClase2 { public: TClase1 *Clas1; TComodin::TRegistros Reg; } Cuando llamo a la clase de la forma Código:
Clas1 = new TClase1(this,Reg); Me da el error : Could Not Find a mach for TClase1::TCLase1(TClase2* Const, TComodin::Reg*) ¿Se puede hacer,No tiene Sentido.....? Gracias |
#4
|
||||
|
||||
El problema está en que typedef realmente no crea nuevos tipos sino que es mas bien un alias. De esta forma como TRegistro[15] es realmente el tipo básico Registro*, el compilador no entiende cuando se trata de un miembro de una clase.
Puedes usar un truco utilizando una referencia intermedia: Código:
class TComodin { public: struct Registro { bool esta; bool Dentro; bool Frio; }; typedef Registro TRegistro[15]; }; class TClase1 { public: TClase1(TComodin::TRegistro& R); }; TClase1::TClase1(TComodin::TRegistro&) { } class TClase2 { public: TComodin::TRegistro Reg; TClase1 *Clas1; void Funcion(); }; void TClase2::Funcion() { TClase2 C2; // Declaro yna referencia del tipo TComodin::TRegistro a C2.Reg // Esa referencia no es realmente una variable... TComodin::TRegistro &Reg = C2.Reg; Clas1 = new TClas1(Reg); // Sin embargo esto funciona talcual, sin necesidad de ninguna referencia: TComodin::TRegistro R; Clas1 = new TClas1(R); } Última edición por escafandra fecha: 26-11-2009 a las 13:16:37. |
#5
|
|||
|
|||
Buenas
He intentado utilizar tu codigo pero me da un error....valla por delante que TClase2 y TCLase1 en mi programa son Form con lo cual uno de los constructores es Código:
_fastcall TClase2(TComponent *Owner); Código:
TClase2 C2; he probado con Código:
TClase C2 = new TClase2(this); Gracias |
#6
|
||||
|
||||
En C++ existen dos formas de crear un objeto:
1- Una es crearlo directamente declarándolo como cualquier variable. Si queremos pasarle parámetros ponemos parénteis y entonces lo que hacemos es llamar a un constructor distinto al constructor por defecto que no tiene parámetros. 2- La otra es declarar un puntero del tipo de la clase que queremos y cuando interese crearlo con un operador new y el constructor. Podemos tener varios constructores. Cuando usamos las VCL, por su construcción, no podemos declarar objetos directamente, sólo punteros, por lo que en tu caso sólo funcionará esto: Código:
TClase* C2 = new TClase2(this); Código:
class TClase: public TForm { ....... public: // Constructores: __fastcall TClase(TComponent* Owner); // por defecto en la VCL __fastcall TClase(TComponent* Owner, TComodin::TRegistro&); // Otro... ....... }; // Fíjate que tienes que llamar al constructor de la clase madre, en este caso TForm. Se hace con esta sintaxis: __fastcall TClase::TClase(TComponent* Owner, TComodin::TRegistro& Reg): TForm(Owner) // aquí, seguido de comas podemos seguir llamando a constructores si tiene herencia múltiple // o declarando variables o miembros: Variable1(valor1), Variable2(valor2) { //codigo } Saludos. |
#7
|
|||
|
|||
Gracias por Contestar (y por la clase magistral) he probado mediante
Código:
class TClase2; { public: TComodin::TRegistro Reg; void Inicializar(); void Funcion(); } void TClase2::Inicializar() { Reg.Esta= true; Reg.Dentro = false; Reg.Frio = true; } void TClase2::Funcion() { TClase2* C2 = new TClase2(this); TComodin::TRegistro &Reg = C2.Reg; P = new TClase1(this,Reg); delete C2; delete P; } Yo declaro la Variable Reg en Clase2 como Global, la inicializo con una serie de valores pero una vez en FUNCION(); al ejecutar TClase2 *C2 =new TClase1(this) pierde eses valores y envia otros. Ademas al salir de la funcion en la que llamo a clase1 (FUNCION()) la variable pierde los valores Modificados. Es como si la variable Reg que paso como parametro del Constructor Clase1 fuera Local de Funcion(). He pensado Crear otra Variable Global del mismo tipo que Reg, y Asignarle los valores ya modificados de Reg,dentro de Funcion();pero en mi programa debere hacer esto mismo con varias variables que funcionaran igual que Reg (varios constructores de Clase1) y me parece algo egorroso...Hay otra solucion, Gracias otra Vez. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
pasar un registro de un dbedit a otro con el procedure edit | betty_loo | Conexión con bases de datos | 1 | 07-11-2007 22:51:55 |
Referencia circular | Enan0 | Varios | 3 | 31-10-2006 22:56:26 |
referencia circular | melon | OOP | 1 | 16-04-2006 02:13:00 |
variables por referencia | shaktale | Varios | 2 | 11-06-2003 12:24:59 |
|