• Sábado 18 de Mayo de 2024, 17:08

Autor Tema:  gramatica de clases en C++  (Leído 2964 veces)

picyo

  • Visitante
gramatica de clases en C++
« en: Viernes 21 de Mayo de 2010, 17:00 »
0
vaya titulo..no sabia como resumir muy bien . Bueno voy directo. Yo he hecho java, y en este lenguaje, al llamar a una funcion, se llama primero a la clase, por ejemplo :

variableObjeto"x"=ClaseQueMeInvento.FunciónQueMeInvento();

Pues haciendo analogía con C++, veo, por ejemplo esto :
Código: C++
  1. Console::ReadKey()
  2.  


Bien, no se explícitamente si Console es una clase en si, o un conjunto de clases. Pero lo que si que tengo claro es que se refiere a algo de clases, y es por eso que me hago una analogía entre "x.x" (java) y "x::x" ( C++).

Hasta aquí, fuera así o no fuera así, me lo creía y le daba explicación a esto. Pero... ahh he visto esta otra función :
Código: C++
  1. while(keyPress.Key != ConsoleKey::Escape);
  2.  
XConcretamente esto :
Código: C++
  1. keyPress.Key != ConsoleKey::Escape);
  2.  

Bien que pasa aqui?
Escape es un objeto de la clase Consolekey? Si es así, entonces pues Console::ReadKey() no debería tener forma de función..
keyPress es una función de la clase Key?
No tengo las idas muy claras acerca de la diferenciación entre "x.y" y " "x::y"
 :(

pmike

  • Miembro activo
  • **
  • Mensajes: 62
    • Ver Perfil
    • http://www.autoresponder.com
Re: gramatica de clases en C++
« Respuesta #1 en: Sábado 22 de Mayo de 2010, 21:16 »
0
ConsoleKey::Escape

se entiende que Escape es un método de la clase ConsoleKey

keyPress.Key

es una tipo de dato llamado estructura por lo que accedemos al elemento Key de la estructura KeyPress

Es lo mismo prácticamente pero con diferente tipo de dato (estruct y class), y accedes a un determinado elemento.
-------------------------------------------------------------

http://www.ebookred.com

-------------------------------------------------------------

picyo

  • Visitante
Re: gramatica de clases en C++
« Respuesta #2 en: Domingo 23 de Mayo de 2010, 19:18 »
0
ahhh Ok. Claro, un struct, para acceder a él es a través del punto. ahora visto asi queda mas que claro... me habia "ofuscado" en tipos o clases, y bueno no habia pensado en el struct. Lo que harñe será ver cómo esta realizado ese struct y de que clase ( o tipo ) es el elemento key. Merci!

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: gramatica de clases en C++
« Respuesta #3 en: Lunes 24 de Mayo de 2010, 03:49 »
0
Buenas.

El . es tambien el operador miembro de las clases.

Por ejemplo si la interfase de la clase es una funcion y una variable, usarias
clase.funcion()
y
clase.variable
para llamar la funcion y obtener el valor de la variable.

Para entender bien el operador :: te sugiero que busques info de los espacios con nombre (namespace). Ya que es un operador de ambito, y no de miembro.
En http://www.conclase.net hay un manual en donde lo explican.

Saludos
The sweet smell of a great sorrow lies over the land.


picyo

  • Visitante
Re: gramatica de clases en C++
« Respuesta #4 en: Domingo 30 de Mayo de 2010, 18:10 »
0
Ok, entiendo que el operador "::" sólo dice la procedencia del espacio de la funcion o variable ( al decir variable seria mejor ya hablar de solo objeto?). Por ejemplo:
Código: C++
  1.  
  2. #include <iostream>
  3. using namespace std;
  4. int main(){ 
  5.    cout << "Hola  "  <<endl;    /////////// 1
  6.   std::cout << " ¿ Que tal ?"<<endl;   /////////// 2
  7.  
  8.  

En la nota 1 no hay operador, en la nota 2 si. Esto dice que la función cout deriva de ese namespace (std). Supongo que en ese namespace han puesto todos los nombres de las variables y/o funciones que se pueden usar, de distintas clases o librerías ( iostream es la clase o libreria a la que me refiero).
Entonces, gracias a que he definido ese espacio ("using namespace std;"  ó "std::cout"  ), el compilador entiende esa funcion. Pero, cúando, pues he de definir una clase ? es decir, por que en esta función :  
Código: C++
  1. keyPress.Key
  2.  
la "procedencia" la he de poner desde la clase keyPress desde el operador punto? Acaso no esta definida pues en ningún namespace? O de otro modo, por que no puedo prescindir de usar el namespace std y por ejemplo hacer la llamda de la funcion de este modo :
Código: C++
  1.  iostream.cout();
  2.  
( que se que no entiende el compilador esto último)

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: gramatica de clases en C++
« Respuesta #5 en: Lunes 31 de Mayo de 2010, 20:05 »
0
El problema ahi, es que cout no es una funcion, es un objeto de tipo class ostream.
The sweet smell of a great sorrow lies over the land.


picyo

  • Visitante
Re: gramatica de clases en C++
« Respuesta #6 en: Lunes 31 de Mayo de 2010, 20:17 »
0
claro, ya entiendo !
se ve raro que un objeto sea usado como funcion ( al menos a mi me pareccia raro) por eso no asociaba. Bueno, voy avanzando :)

picyo

  • Visitante
Re: gramatica de clases en C++
« Respuesta #7 en: Martes 1 de Junio de 2010, 20:42 »
0
Bueno , he profundizado un poco mas. por ejemplo :
Código: C++
  1.  
  2. ConsoleKeyInfo KeyPress;
  3. KeyPress=Console::ReadKey(true);    // ESTO ES A
  4.  
  5. while(keyPress.key != ConsoleKey::Escape){    // ESTO ES B y ESTO ES C
  6.  
  7. // (...)
  8.  
  9. }return 0;  
  10.  

ESTO ES A
Código: C++
  1.  
  2. public:
  3. static ConsoleKeyInfo ReadKey (
  4.     bool intercept
  5. )  
  6.  

ESTO ES B
Código: C++
  1.  
  2. public enum class ConsoleKey
  3. ------------------------------------------
  4. ------------------------------------------
  5. ejemplos:
  6. A   Tecla A.
  7. Add Tecla Agregar.
  8. Applications    Tecla Aplicación (Microsoft Natural Keyboard).
  9. (...)
  10.  
ESTO ES C
Código: C++
  1.  
  2. public:
  3. ConsoleKeyInfo (
  4.     wchar_t keyChar,
  5.     ConsoleKey key,
  6.     bool shift,
  7.     bool alt,
  8.     bool control
  9. )
  10.  

En ESTO ES A, hemos creado un objeto de la clase ConsolekeyInfo, y lo inicializamos mediante el método ReadKey, aunque este método no "lo tenemos" desde un objeto creado por nosotros, sinó que lo llamamos desde la "clase madre" .

Con eso he comprobado que no se igualan dos tipos distintos ( de ser contrario, hubiera habido que tener un conversor). Los dos tipos son tipo ConsoleKeyInfo. A la hora de llamar el método ReadKey(), se hace sin haber creado un objeto ( se usaría el "."). Entonces deberiamos hacer algo asi como " ConsoleKeyInfo.ReadKey", pero no es exactamente asi.

EN ESTO ES C, se ve que variables integran la clase ConsoleKeyInfo, una de ellas es key, tipo ConsoleKey ( ConsoleKey a su vez es un tipo enumerado, de todos los caracteres del teclado estándar).

Bien entonces, por que no se llama como he dicho antes (" ConsoleKeyInfo.ReadKey") ? Pues a mi modo de entender, cuando se quiere usar un método o objeto de una clase sin haber creado el objeto ( como en este caso KeyPress), se llama a la clase directamente, o se dice la procedencia, mejor dicho, pero no de la clase, sinó de donde esta esa clase. En este caso, nuestra clase ConsoleKeyInfo está dentro de lo que ( a mi, correjidme si no es correcto) una "super clase" o simplemente una librería que integra diferentes objetos, o métodos...

Entonces, con la funcion Readkey(true), activamos la deteccion de caracteres del teclado estándar, y se compara ese ( evento?) con la tecla Escape, que es un tipo ConsoleKey, dentro a su vez ( como variable integrada)del constructor de CosnoleKeyInfo.

La raíz de todo: podriamos decir que ralmente Console es una super clase donde dentro estan, por ejemplo, el objeto readKey?