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?
¿Eso te compila? :o
Sync
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?
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
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.
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:
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!
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.
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
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.
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
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;
}
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)
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
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 :?:
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
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
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.
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
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
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
ethernet, estás usando friend, eres un vendido X'DDD
Sync
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!
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:
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
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