Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cosas del C++

Iniciado por Haddd, 13 de Noviembre de 2002, 07:33:27 PM

« anterior - próximo »

Haddd

                                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?                                

synchrnzr

                                ¿Eso te compila? :o

Sync                                

Haddd

                                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?                                

synchrnzr

                                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                                

Haddd

                                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.                                

Grugnorr

                                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:                                
hat the hells!

MChiz

                                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!                                

Haddd

                                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.                                

synchrnzr

                                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                                

Haddd

                                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.                                

ethernet

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

ethernet

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;
}

synchrnzr

                                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)                                

ethernet

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

synchrnzr

                                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 :?:                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.