Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-06-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Código:
class TInt
{
  private:
  int I;
  public:
  float ToFloat();
  char  ToHex();
};

class TClase
{
  public:
  TInt Int;
  float ToFloat();
  char  ToHex();
};

//........................................
  
void funcion()
{
  TClase C;
  C.Int.ToFloat();
}


Saludos.
Responder Con Cita
  #2  
Antiguo 27-06-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
bueno ¿Y si la clase que contiene las funciones tiene que poder trabajar con variables y objetos que estan declarados en el private de la otra clase? Ese es el caso concreto. Ya lo he conseguido pero en vez de usar otra clase he creado una estructura en el public de la clase y en esa estructura hay punteros a los metodos, los cuales se declaran en el private de la misma clase. Para poder hacer que se trague esto tuve que usar __closure* que no se ni que es. Tambien en el constructor de la clase asigno a los punteros los metodos que tengo definidos. Luego cuando llegue a casa pongo lo que hice a ver si te parece correcto o no. Solo un detalle y esque cuando hago uso de la funcion, al escribirla me aparece en lalista y le doy pero aparece sin parentesis al final y se lo tengo que poner yo junto con el parametro.
Responder Con Cita
  #3  
Antiguo 27-06-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Bueno ya estoy por casa. Al final he guardado el que usa __closure porque funciona pero estoy intentando arreglarlo asi:

En el constructor:
Código:
TPrueba::TPrueba()
{
    //Creo la estructura
    Conversion = new TIPOS;

    //Inicializacion de las funciones de la estructura para los Anti-Anti-Debug
    Conversion->toFloat = &toFloat;
    Conversion->toBin = &toBin;
}
En el public de la clase:
Código:
//Declaracion del tipo de estructura para los Anti-Anti-Debug
struct TIPOS{
        AnsiString __fastcall (TPrueba::*toFloat(int));
        AnsiString __fastcall (TPrueba::*toBin(int));
}*Conversion;
En el private tengo esto:
Código:
AnsiString __fastcall toFloat(int);
AnsiString __fastcall toBin(int);
En el .cpp de la clase tengo esto:
Código:
AnsiString __fastcall TPrueba::toFloat(int value)
{
    return "";
}
//---------------------------------------------------------------------------

AnsiString __fastcall TPrueba::toBin(int value)
{
    return "";
}
Y por ultimo en el Unit1.cpp tengo esto:
Código:
Prueba  = new TPrueba();

AnsiString Float = Prueba->Conversion->toFloat(1000);
AnsiString Bin = Prueba->Conversion->toBin(1000);
Y el error que me está dando es este:
Código:
[C++ Error] TPrueba.cpp(16): E2235 Member function must be called or its address taken
[C++ Error] TPrueba.cpp(17): E2235 Member function must be called or its address taken
Me pone en rojo la zona donde asigno el miembro al puntero, en el constructor.
Responder Con Cita
  #4  
Antiguo 28-06-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Esto funciona pero usa __closure: http://pastebin.com/czvfhEj8
Ya que hago algo me gustaria hacerlo lo mas correcto posible. Podria declarar sin problema los metodos como publicos y no tendria problemas ni tendria que crear una estructura o clase ni nada pero estarián desordenados, o sea, no podria crear un orden como el que he creado ahi. O sea, que si voy a trabajar con cadenas pues al poner un -> me salgan todos los metodos para cadenas, si voy a trabajar con enteros pues que al poner el -> que me salgan solo los que sirvan para enteros y asi con todo. Mas o menos lo que hace Builder cuando haces un Edit1->Text.sprintf("%i",9) que como ves te muestra la funcion sprintf.
Responder Con Cita
  #5  
Antiguo 28-06-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Lo ultimo que he probado pero no soy capaz de hacerlo compilar es esto: http://pastebin.com/4Pd9DYEr
El problema lo tenemos en la funcion miembra de TInt que no soy capaz de asignar el valor de entrada a la direccion donde apunta el puntero ni tampoco mostrar su valor.
Responder Con Cita
  #6  
Antiguo 28-06-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Perdon por escribir tanto pero en realidad lo que necesito hacer es esto:
Código:
class TPrueba; //Declaro la clase TPrueba
 
   class TInt
   {
        public:
                //Constructor y destructor
                TInt();
                ~TInt();
 
                //Declaraciones de las funciones para TInt
                AnsiString toHex(int value);
        private:
                THilo* TPrueba::*Hilo; //Declaro el puntero a miembro
   };
 
   //La clase TPrueba
   class TPrueba
   {
        friend class TInt; //Pongo esto para que pueda acceder al puntero al TThread que está en private
 
        public:
                TPrueba();
                ~TPrueba();
        private:
                THilo *Hilo; //Puntero a TThread
}
 
//Constructor de la clase TInt
TInt::TInt()
{
        Hilo = &TPrueba::Hilo; //Le asigno la direccion del miembro TPrueba al puntero a miembro de la clase TInt
}
 
//Funcion miembro de la clase TInt que usa el puntero a miembro que creé
AnsiString __fastcall TInt::toHex(int value)
{
        //Esto no lo quiere:
        ((THilo *)->Hilo)->toHex(value);
        //He probado de todo pero no doy con el modo
}
No es mas que un ejemplo pero creo que ahora se entenderá mejor. Necesito hacer que funcione lo que está en la funcion miembro.
Responder Con Cita
  #7  
Antiguo 29-06-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Creo que te complicas la vida perdiéndote en la sintaxis. No puedes pensar en determinada solución sintáctica para enfocar el problema en esa dirección sino al revés. En esos ejemplos no queda claro cual es el planteamiento del problema que quieres resolver pro lo que no puedo orientarte bien.

Si te puedo decir que las clases con punteros hay que manejarlas muy bien o tendrás problemas difíciles de depurar.


Esto:
Código:
 ((THilo *)->Hilo)->toHex(value);
No puede compilar, ni tiene sentido. Un cast no es una clase. ¿Cual es la definición de Hilo?
Piensa en usar clases derivadas.


Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar mi clase a una clase de 3 capas o lo mas parecido elarys OOP 2 07-04-2011 23:02:54
clase que contiene otra clase definida de forma posterior astwin OOP 5 20-02-2009 11:26:55
Es posible hacer una nueva clase de componente ?? ilichhernandez OOP 7 05-05-2008 16:01:30
Clase jakuna OOP 2 30-08-2007 21:50:35
Clase para hacer ABM mateamargo OOP 3 25-10-2005 22:34:23


La franja horaria es GMT +2. Ahora son las 20:04:13.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi