Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Haddd en 13 de Noviembre de 2002, 07:33:27 PM

Título: Cosas del C++
Publicado por: Haddd en 13 de Noviembre de 2002, 07:33:27 PM
                                Quiero hacer lo siguiente:

class prueb {
public:
   bool m_a;
   struct Mostrar { bool ValorDe_m_a(); } mostrar;
};

bool prueb::Mostrar::ValorDe_m_a()
{
   return m_a;
}

Y me da un error en return m_a. Bien, Yo lo que quiero es estructurar las funciones de una clase. ¿alguna idea?                                
Título: Cosas del C++
Publicado por: synchrnzr en 13 de Noviembre de 2002, 07:35:46 PM
                                ¿Eso te compila? :o

Sync                                
Título: Cosas del C++
Publicado por: Haddd en 13 de Noviembre de 2002, 07:39:24 PM
                                No, me da un error. Pero yo quiero poder estructurar las funciones de una clase, puediendo acceder a los miembros de la clase padre.¿alguna idea?                                
Título: Cosas del C++
Publicado por: synchrnzr en 13 de Noviembre de 2002, 07:45:48 PM
                                Juer, o no te entiendo nada o no estás nada familiarizado con el C++ ^_^'

class prueb {
public:
bool m_a;
bool ValorDe_m_a();
};

bool prueb::ValorDe_m_a()
{
return m_a;
}

Esto debería funcionarte, no entiendo todo el follón que montas con el struct y demás :?:

Sync                                
Título: QUERR
Publicado por: Haddd en 13 de Noviembre de 2002, 07:50:58 PM
                                Bien, mira este ejemplo:

class Video
{
...un montón de variables
...un motón de funciones
}

Yo quiero:

class Video
{
word ancho,alto;
struct {
void Inicializar();
void AjustarTamañoVentana();
void EstablecerFullScreen();
} t_Inicializacion;

struct {
void Render();
void RenderToSurface();
void Clear();
} t_Render;

}

En el primer ejemplo, yo utilizaría Video de esta forma:

Video.Inicializar();
Video.EstablecerFullScreen();
Video.Render();

En el segundo yo QUERRIA usarlo así:

Video.t_Inicializar.Inicializar();
Video.t_Inicializar.EstablecerFullScreen();

Video.t_Render.Clear();

Video.t_Render.Render();

Mucho más claro el 2º método, ¿no?

La cuestión es que sí me lo permite C++, lo que no me permite es acceder a variables de la clase Video desde dentro de una estructura.                                
Título: ...
Publicado por: Grugnorr en 13 de Noviembre de 2002, 08:17:49 PM
                                Que yo sepa puedes meter un namespace dentro de la clase y hacer lo que intentas, de formas mucho más clara y elegante, porque eso es un churro  :jaja:                                
Título: Cosas del C++
Publicado por: MChiz en 13 de Noviembre de 2002, 10:00:06 PM
                                Hola!
Porque no haces esto?:

struct t_Inicializacion {
void Inicializar();
void AjustarTamañoVentana();
void EstablecerFullScreen();
};

struct t_Render {
void Render();
void RenderToSurface();
void Clear();
};

class Video
{
word ancho,alto;

t_Inicializacion inicializacion;
t_Render render;

}

Almenos es como yo lo hago...
Un saludo!                                
Título: Cosas del C++
Publicado por: Haddd en 13 de Noviembre de 2002, 11:41:49 PM
                                Grugnorr: ¿podrías ponerme un ejemplo?

MChiz.:Así NO puedo acceder desde las funciones a las variables de la clase Video que es lo que quiero.                                
Título: Cosas del C++
Publicado por: synchrnzr en 14 de Noviembre de 2002, 09:35:22 AM
                                Para hacer esta jerarquía que dices supongo que yo la haría de este modo:

class CRender {
void Render();
void RenderToSurface();
void Clear();
}

class CInicializacion {
void Inicializar();
void AjustarTamañoVentana();
void EstablecerFullScreen();
}

class CVideo
{
word ancho,alto;
CInicializacion Inicializacion;
CRender Render;
}

CVideo Video;

Así ya puedes hacer, por ejemplo:

Video.Render.RenderToSurface()

o

Video.Inicializacion.AjustarTamañoVentana()

como tu quieres. Creo que las clases de las MFC, DirectX y de la VCL de Borland siguen esta estructura (mi motor de sonido para DirectX también ;))

Sync                                
Título: Cosas del C++
Publicado por: Haddd en 14 de Noviembre de 2002, 09:58:42 AM
                                Pero Sync, de esta forma no puedo acceder a las variables miembro, que es lo que yo quiero. Piensalo bien, ¿Cómo puedes desde la clase CRender acceder a una variable que está en CVideo? Ese es mi problema.                                
Título: Cosas del C++
Publicado por: ethernet en 14 de Noviembre de 2002, 10:43:42 AM
Podrias hacer:

class prueb {
public:
static bool m_a;
struct Mostrar { bool ValorDe_m_a(); } mostrar;
};

bool prueb::Mostrar::ValorDe_m_a()
{
return prueb::m_a;
}

aunque tb puedes hacer (mas cutre)

#define Inicializacion.Init(x) Init(x)

reder foo;

foo.Inicializacion.Init(MEGA_VERSION_SUCKS_DE_DX); // ;PP

aunque no se si esta ultima funcionara bien
Título: Cosas del C++
Publicado por: ethernet en 14 de Noviembre de 2002, 11:06:48 AM
Haciendo alguna prueba se me ha ocurrido algo aun mas cutre:

class Init;

class foo {
protected:
   int var;
   public:
      show(){ printf("-----%d-----",var);}
      Init *i;
      
};
class Init:public foo {
public:
   Init(){ i = this; }
   void P();
};



void Init::P(){
   printf("holan");
   var = 9;
}

int main(int argc, char* argv[])
{
   Init o;
   o.i->P();
   o.show();
   
   return 0;
}
Título: Cosas del C++
Publicado por: synchrnzr en 14 de Noviembre de 2002, 11:08:46 AM
                                CRender y CInicialización las tienes que definir como clases friend de CVideo, sorry lo olvidé:

class CRender {
void Render();
void RenderToSurface();
void Clear();
}

class CInicializacion {
void Inicializar();
void AjustarTamañoVentana();
void EstablecerFullScreen();
}

class CVideo
{
friend class CRender;
friend class CInicializacion;

word ancho,alto;
CInicializacion Inicializacion;
CRender Render;
}

Creo que sería algo más o menos así pero tampoco lo voy a compilar para probarlo, que no tengo tiempo ^_^'

Sync

PD: Haddd tio, mírate la MSDN o algun manual de C++ que eso es de lo más básico (estoy a punto de mandarte al foro de principiantes :D)                                
Título: Cosas del C++
Publicado por: ethernet en 14 de Noviembre de 2002, 11:30:23 AM
Sync no es tan basico hacer lo q dice haddd almenos de una forma elegante y usar friend es programacion poco elegante, rompe todo el sistema OO.

Y por cierto, donde pasar la instancia del objeto de CVideo a las demas clases para q pueda acceder a sus variables privadas ?. :). De todas maneras haddd tiene una mania bastante mala de poner las variables de los objetos publicas (por lo q he visto en su motor) no es necesario friend ahi para acceder a sus variables, el problema como te he dicho es la instacia al objeto. como ves no es tan simple como parece.

saludos
Título: Cosas del C++
Publicado por: synchrnzr en 14 de Noviembre de 2002, 11:48:30 AM
                                Ola,

Bueno, no me echeis la caballería por encima ahora :o

El modificador friend se supone que está para algo, sino se lo hubieran ahorrado ¿Cómo se sobrecargan los operadores aritméticos por defecto, por ejemplo? No me dirás que al sobrecargar operator+ usando friend (que es la única forma de hacerlo o por lo menos la única que conozco) te estás cargando la orientación a objetos ^_^'

Igual que sirve para que las funciones de los operadores aritméticos puedan acceder a las variables privadas de una clase, lo mismo sirve para que otras clases puedan acceder a ellas también. Pero bueno, entiendo que puede ser que a CVideo le de vergüenza que le miren sus partes privadas X'DDD

Sync

PD: Lo del foro de principiantes era broma hombre (a ver si aun os lo tomareis mal ^_^')

PPD: Por lo que dice, no creo que Haddd esté definiendo las variables de CVideo como públicas :?:                                
Título: Cosas del C++
Publicado por: ethernet en 14 de Noviembre de 2002, 11:52:49 AM
si, se para q vale friend, pero me refiero q para acceder a las variables privadas de algo tienes q saber cual es ese algo xD. tienes q pasarle una instancia al objeto el cual quieres modificar.

En el caso de los operadores  tiene su explicacion y viene en casi todos los tutoriales de c++.

re:PDD: haddd pone como  publicas un monton de variables en su motor, si no miralo tu mismo en los .h.
PDDD:(como haDDD) recomiendo la lectura de effective c++ y more EC++
saludos
Título: Cosas del C++
Publicado por: synchrnzr en 14 de Noviembre de 2002, 12:14:49 PM
                                Coño, en lo de la instancia me has pillado por los cojones :o

Vale, ya está, esta es mi última oferta :P

class CVideo
{
   unsigned int ancho,alto;

   class CRender {
      void Render();
      void RenderToSurface();
      void Clear();
   };

   class CInicializacion {
      void Inicializar();
      void AjustarTamanoVentana();
      void EstablecerFullScreen();
   };
};

Garantizo que esto tiene que ser compilable (si no me suicido ya XDDD) y además se puede hacer eso tan feo de:

CVideo::CInicializacion::Inicializar()
{
   while(TRUE)
   printf("Como os rallais peñaaaaaaaaa!!!n");
}

Antes lo he puesto todo un poco sin pensar, mirando como lo tenía hecho en mi motor... pero no contaba que en mi caso estoy sujeto a circunstancias especiales, sorry ^_^'

Sync

PD: Pero no me negareis que no era tan difícil :D                                
Título: Cosas del C++
Publicado por: Haddd en 14 de Noviembre de 2002, 01:39:10 PM
                                Es decir sync, que si utilizo class en lugar de struct sí debería poder hacerlo, es decir, poder acceder a las variables de la clase Video. Bien, lo probaré. También he visto cosas utilizando namespace, pero no lo he probado.

Respecto a mis conocimientos de C++, os diré que las versiones anteriores de mi motor sí definían correctamente las variables privadas, en lugar de tenerlas todas públicas. Es mucho más elegante y mucho más correcto. Sin embargo te obliga a tener un motón de funciones para recoger/modificar los valores, y es algo que llegué a odiar, precisamente por que la estructura de la clase me quedaba muy heavy. Si consigo estructurar las funciones dentro de la clase, entonces puedo volver a replantearme utilizar variables privadas.                                
Título: Cosas del C++
Publicado por: synchrnzr en 14 de Noviembre de 2002, 02:22:10 PM
                                Pon privadas las que tengan que serlo y públicas las que no, es lo suyo :D

La verdad, yo cuando hago pruebas también las pongo todas públicas de entrada y luego ya pongo privadas las que tienen que serlo. No sé, no creo que sea un crimen :oops:

Sync                                
Título: Cosas del C++
Publicado por: ethernet en 14 de Noviembre de 2002, 06:52:38 PM
Mi ultima solucion q es una parte de la de sync:

class CVideo;

class CRender {
CRender(CVideo &v): m_vid(v) {}
void Render();
void RenderToSurface();
void Clear();
private:
CVideo &m_vid;
}

class CInicializacion {
//constructi igual q CRender
void Inicializar();
void AjustarTamañoVentana();
void EstablecerFullScreen();
}

class CVideo
{
public:
friend class CRender;
friend class CInicializacion;

CVideo(): Inicializacion(*this),Render(*this){...}
CInicializacion Inicializacion;
CRender Render;

private:
word ancho,alto;

}

asi CRender pueden acceder a las variables de CVideo con la instancia q se les pasara.

saludos
Título: Cosas del C++
Publicado por: ethernet en 14 de Noviembre de 2002, 06:55:14 PM
Sin embargo pienso q declarar las variables de CVideo como static adelantarias mucho mas, ademas segun tienes en tu motor puesto el video (en el q solo hay una instacia a ese objeto) es muy logico ponerla static ;)
saludos
Título: Cosas del C++
Publicado por: synchrnzr en 14 de Noviembre de 2002, 07:42:47 PM
                                ethernet, estás usando friend, eres un vendido X'DDD

Sync                                
Título: Cosas del C++
Publicado por: Haddd en 14 de Noviembre de 2002, 07:52:33 PM
                                Gracias por la ayuda, pero no es esto lo que quiero. Sí funcionaría, pero me complica el código y es algo que no quiero hacer. La verdad es que lo lógico es que una clase definida dentro de otra clase debería heredar sus variables, pero no es así.

En fin, a ver si alguien nos sorprende con una opción mágica!                                
Título: Cosas del C++
Publicado por: synchrnzr en 14 de Noviembre de 2002, 07:59:22 PM
                                Haddd: déjate de mariconadas y pon el ancho y alto de la pantalla como variables globales de tu DLL X'DDD

Sync

PD: Lo importante es que funcione ¿no? :loco:
PPD: Al final me enfadaré y pillaré el compilador :X9:                                
Título: Cosas del C++
Publicado por: ethernet en 14 de Noviembre de 2002, 09:07:16 PM
sync mi solucion es la de usar static pero esa ya la di antes, no soy un vendido xDDDD.
Yo creo q una cosa bien contruida no deberia dar esos problemas, aunue yo creo q esta claro como esta (lo digo por el motor) son cosas del dracula q se emparanoia. :)

saludos
Título: Cosas del C++
Publicado por: synchrnzr en 15 de Noviembre de 2002, 09:39:24 AM
                               
CitarYo creo q una cosa bien contruida no deberia dar esos problemas, aunue yo creo q esta claro como esta (lo digo por el motor) son cosas del dracula q se emparanoia. :)

En esto estoy un 100% de acuerdo contigo :X9:

Sync