Un par de dudas con c++

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Un par de dudas con c++

Notapor Barajas » Jue Jul 05, 2012 7:19 pm

Hola.

Esta ves estaba empezando a desarrollar un juego con SDL y c++, y mientras escribía código, me surgieron un par de dudas....

1° ¿Es posible hacer esto de otra manera? o ¿Por qué aveces no funciona?

Sé que no es posible tener como atributo de una clase a otra clase, pero también si se puede tener como atributo un apuntador a clase, así que se me ocurrió esto...

class Clase_2{
Clase_1 * ejemp;
public:
Clase_2(){
//inicializo el atributo ejemp, que es una clase
ejemp = new Clase_1();
};
~Clase_2(){};
void funcion_algo(void){
//llamo a un método proio de la Clase_1 que es atributo
//que es atributo de la Clase_2, de esta manera
this->ejemp->funcion_algo();
};
};


Pero esto algunas veces no me funciona para mandar a llamar algunos métodos de una clase definida como atributo ¿Por qué?

2° ¿Cómo quito el "simbolo del sistema"?

Cuando compilo un programa gráfico en Windows con SDL, cuando lo ejecuto siempre sale la terminal, aun que no se le mande nada. ¿Como evito eso?

La primera es mas que nada una duda existencial y la otra es una practica XD
Bueno, de antemano , gracias :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Un par de dudas con c++

Notapor hugoruscitti » Jue Jul 05, 2012 8:07 pm

Buenas Barajas!

Lo segundo creo que se logra cambiando los flags de compilación y
la función principal del programa (main). En este artículo hay
una sección, casi al final, que explica cómo hacerlo. está bajo el título
"mensajes de consola":

http://www.losersjuegos.com.ar/referenc ... lar_devcpp
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: Un par de dudas con c++

Notapor Barajas » Jue Jul 05, 2012 8:16 pm

Muchas gracias hugoruscitti :)

Ahora solo queda la primera que es para mi curiosidad :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Un par de dudas con c++

Notapor carlostex » Jue Jul 05, 2012 11:08 pm

Me gustaria ver un ejemplo donde esto no funciona, por que no debería tener ni un problema, en C++ todo es una clase: int, char etc. entonces perfectamente puedes usar apuntadores a esas clases, creo que el error esta aquí: ejemp = new Clase_1();
Por que cuando el constructor no tiene parámetros la llamada correcta es así: ejemp = new Clase_1;
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Un par de dudas con c++

Notapor Barajas » Vie Jul 06, 2012 12:33 am

carlostex escribió:Me gustaria ver un ejemplo donde esto no funciona, por que no debería tener ni un problema, en C++ todo es una clase: int, char etc. entonces perfectamente puedes usar apuntadores a esas clases, creo que el error esta aquí: ejemp = new Clase_1();
Por que cuando el constructor no tiene parámetros la llamada correcta es así: ejemp = new Clase_1;


Bueno, parece que el errores que me mandaba había sido por un un error de dedo :oops:

Pero eso si, al declararlo de la forma "ejemp = new Clase_1()" funciona para inicializar el objeto, incluso puedo darle parámetros....

Lo corregí tomando el cuenta lo que dices de que en C++ todo es una clase (aun que tengo mis dudas XD ) para que fuera algo de la siguiente forma...

class Clase_2{
Clase_1 ejemp;
public:
Clase_2(){
//inicializo el atributo ejemp, que es una clase
this->ejemp = Clase_1();
};
~Clase_2(){};
void funcion_algo(void){
//llamo a un método proio de la Clase_1 que es atributo
//que es atributo de la Clase_2, de esta manera
this->ejemp.funcion_algo();
};
};


Pero, :shock: al terminar el programa....

Código: Seleccionar todo
*** glibc detected *** ./ejem: double free or corruption (out): 0x099305d8 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x73e42)[0x304e42]
/usr/lib/i386-linux-gnu/libSDL-1.2.so.0(SDL_FreeSurface+0x100)[0x938590]
./ejem[0x8049b40]
./ejem[0x8049f67]
./ejem[0x804981d]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x2aa4d3]
./ejem[0x8048be1]
======= Memory map: ========
(aquí hay un numero exagerado de lineas  )


y este error no sucede si lo hago de la primera forma....
aun así, resulta basten curiosa esta forma de hacer una clase el atributo de otra... :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Un par de dudas con c++

Notapor carlostex » Vie Jul 06, 2012 2:19 am

Te pongo dos ejemplos que probe:

Código: Seleccionar todo
#include<iostream>

using namespace std;

class Clase_1
{
   int a;
   public:
   Clase_1(int _a):a(_a){}
   Clase_1(){}
   void funcion_algo()
   {
      cout<<"Funcion algo "<<a<<endl;
      
   }
   
   
   
};
class Clase_2{
   
            Clase_1 ejemp;
            public:
            Clase_2(){
                //inicializo el atributo ejemp, que es una clase
                this->ejemp = Clase_1(10);
                }
            ~Clase_2(){};
            void funcion_algo(void){
                //llamo a un método proio de la Clase_1 que es atributo
                //que es atributo de la Clase_2, de esta manera
                this->ejemp.funcion_algo();
                }
};
           
int main()
{
   
   Clase_2 a;
   
   a.funcion_algo();
   
}


La salida es: Funcion algo 10

y aqui usando los apuntadores:
Código: Seleccionar todo
#include<iostream>

using namespace std;

class Clase_1
{
   int a;
   public:
   Clase_1(int _a):a(_a){}
   Clase_1(){}
   void funcion_algo()
   {
      cout<<"Funcion algo "<<a<<endl;
      
   }
   
   
   
};
class Clase_2{
   
            Clase_1 *ejemp;
            public:
            Clase_2(){
                //inicializo el atributo ejemp, que es una clase
                this->ejemp = new Clase_1(10);
                }
            ~Clase_2(){};
            void funcion_algo(void){
                //llamo a un método proio de la Clase_1 que es atributo
                //que es atributo de la Clase_2, de esta manera
                this->ejemp->funcion_algo();
                }
};
           
int main()
{
   
   Clase_2 a;
   
   a.funcion_algo();
   


y la salida es la misma. Saludos
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Un par de dudas con c++

Notapor kingwar » Vie Jul 06, 2012 2:21 am

Voy citando y comentando ;)

Sé que no es posible tener como atributo de una clase a otra clase, pero también si se puede tener como atributo un apuntador a clase, así que se me ocurrió esto...


¿Cómo que no se puede tener como miembro una clase? ¡Claro que sí! en C++ como ya te dijo carlostex todo es una clase...

Ejemplo:

#include <cstdlib>
#include <iostream>

using namespace std;

class Libro{
public:
void mostrar(){
cout << "Soy un libro =)!!!"<<endl;
}
};

class Contenedora{
public:
void mostrar_libro(){
calculo.mostrar();
}
private:
Libro calculo;
};

int main(int argc, char *argv[])
{
Contenedora stant;
stant.mostrar_libro();

system("PAUSE");
return EXIT_SUCCESS;
}


Cuando declaras una clase como atributo de otra se hace sin argumentos...
(...)
public:
claseAtributo objeto;
(...)

Así el constructor de la clase necesite argumentos no se ponen ahí...
Para inicializar el objeto con sus respectivos argumentos, se hace en el constructor de la clase que lo contiene, de esta manera:

(...)
NombreClase::NombreClase(Argumentos):
objeto(Argumento1,Argumento2,...,ArgumentoN) , otroObjeto(Argumento1,Argumento2,...,ArgumentoN){

Inicializaciones de la clase contenedor
}
(...)
class Clase_2{
Clase_1 * ejemp;
public:
Clase_2(){
//inicializo el atributo ejemp, que es una clase
ejemp = new Clase_1();
};


Quítale los paréntesis, esto no es python. Pónselos solo cuando le pases argumentos al constructor.
Otra cosa... siempre cuando creas algo con el operador new , debes borrar la memoria asignada con delete, si llamas n veces a new llama n veces a delete.

class Clase_2{
Clase_1 ejemp;
public:
Clase_2(){
//inicializo el atributo ejemp, que es una clase
this->ejemp = Clase_1();
};
~Clase_2(){};


Si ya le reservaste memoria para que haces:
this->ejemp = Clase_1();
//Error logico, ya ejemp estaba referenciado a una instancia
Si lo que querías es pasarles argumentos al constructor ya te dije como hacerlo.
"pero si estudias computacion deberias saber manejar todos los programas" conclusion:usuario no es gente

-linkingcrk- http://baulprogramas.blogspot.com/
Avatar de Usuario
kingwar
 
Mensajes: 35
Registrado: Dom Abr 10, 2011 9:32 pm
Ubicación: Venezuela-Miranda

Re: Un par de dudas con c++

Notapor Barajas » Vie Jul 06, 2012 6:14 am

carlostex escribió:y la salida es la misma. Saludos


Sí, también me he dado cuenta de eso :)

kingwar escribió:
Sé que no es posible tener como atributo de una clase a otra clase, pero también si se puede tener como atributo un apuntador a clase, así que se me ocurrió esto...


¿Cómo que no se puede tener como miembro una clase? ¡Claro que sí! en C++ como ya te dijo carlostex todo es una clase...


:oops: bueno, como me había dado error asumí eso (mea culpa, mea culpa ) :) .

kingwar escribió:Quítale los paréntesis, esto no es python. Pónselos solo cuando le pases argumentos al constructor.


Apenas llevo unos días con C++ y me estoy acostumbrando a un par de cosas con su orientado a objetos jeje, y es algo difícil olvidar las costumbres de python (y más si en apariencia no causan ningún conflicto XD )

Tomare en cuenta sus observaciones para la escritura de mi código en C++. :D

Solo una duda de estilo...
¿Que tan recomendable es hacer funciones "in line"?

Muchas gracias. :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Un par de dudas con c++

Notapor carlostex » Sab Jul 07, 2012 5:11 am

Barajas escribió:Solo una duda de estilo...
¿Que tan recomendable es hacer funciones "in line"?


Lo dejare un poco a tu criterio explicandote para que sirve por si no lo sabes. Cuando a una funcion le pones in line lo que hace el compilador es poner el codigo en donde la llamaste, es decir copia el código en el lugar donde llamaste a la función. Entonces si tu funcion es grande no vale la pena usarlo, por que el programa se hara mas grande, por lo general se usa en funciones chicas, sin embargo han sido pocas las veces en donde he visto que se use, se usa con mas frecuencia las macros.
Saludos.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado