La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.

Presentaciones similares


Presentación del tema: "Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2."— Transcripción de la presentación:

1 Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2

2 C HISTE DEL D ÍA Informática II 2011/2 2

3 C ONTENIDO Informática II 2011/2 3 Variables miembro estáticas 1 Funciones miembro estáticas 2 Punteros a funciones 3 4 Arreglo de punteros a funciones

4 C LASES Y FUNCIONES ESPECIALES Informática II 2011/2 4 Hasta ahora se ha estudiado diferentes mecanismos que tiene C++ para manipular variables: variables globales, variables locales de las funciones, punteros a variables y variables miembro. En C++ existen métodos para que diferentes objetos del mismo tipo puedan compartir variables y funciones.

5 D ATOS MIEMBRO ESTÁTICOS 1 Las variables miembro declaradas como static son compartidas a lo largo de las instancias de la clase. 2 Se dice que una variable miembro static pertenece como tal a la clase en vez de al objeto, es por ello que se puede tener acceso a ella como si se tratase de una variable global 3 A pesar de que la variable es estática y privada, cualquier método de la clase puede tener acceso a ella o a cualquier otra variable miembro. Informática II 2011/2 5

6 D ATOS MIEMBRO ESTÁTICOS 4 Incluso no se hace necesario instanciar un objeto de la clase para tener acceso directo a esta, si es definida como publica. 5 Las variables miembro normales son creadas por cada objeto instanciado, pero solo existe una variable estática por clase. Informática II 2011/2 6 Buena practica de programación Es preferible definir la variable estática como privada y otorgarle un método de acceso público, sin embargo de esta manera se debe crear primero un objeto para a través de él poder acceder al método. Buena practica de programación Es preferible definir la variable estática como privada y otorgarle un método de acceso público, sin embargo de esta manera se debe crear primero un objeto para a través de él poder acceder al método.

7 Informática II 2011/2 7 D ATOS MIEMBRO ESTÁTICOS #include using namespace std; class Cat { public: Cat(int age):itsAge(age){HowManyCats++; } virtual ~Cat() { HowManyCats--; } virtual int GetAge() { return itsAge; } virtual void SetAge(int age) { itsAge = age; } static int HowManyCats; private: int itsAge; }; int Cat::HowManyCats = 0; int main() { const int MaxCats = 5; int i; Cat *CatHouse[MaxCats]; for (i = 0; i<MaxCats; i++) CatHouse[i] = new Cat(i); for (i = 0; i<MaxCats; i++) { cout << "There are "; cout << Cat::HowManyCats; cout << " cats left!\n"; cout << "Deleting the one which is "; cout GetAge(); cout << " years old\n"; delete CatHouse[i]; CatHouse[i] = 0; } return 0; } "There are “ 5 cats left Deleting the one which is 0 years old "There are “ 4 cats left Deleting the one which is 1 years old "There are “ 3 cats left Deleting the one which is 2 years old "There are “ 2 cats left Deleting the one which is 3 years old "There are “ 1 cats left Deleting the one which is 4 years old

8 T IPS AL USAR DATOS MIEMBROS ESTÁTICOS * Use variables miembro estáticas para compartir datos entre todas las instancias de una clase. * Declare variables miembro estáticas protected o private, si desea restringir el acceso a estas. * No utilice variables miembro estáticas para almacenar datos de un objeto. Informática II 2011/2 8

9 C ONTENIDO Informática II 2011/2 9 Variables miembro estáticas 1 Funciones miembro estáticas 2 Punteros a funciones 3 4 Arreglo de punteros a funciones

10 F UNCIONES MIEMBRO ESTÁTICAS También se puede acceder a estos métodos estáticos a través de un objeto creado, similar a como es llamado un método miembro cualquiera. Las funciones miembro estáticas son como las variables miembro estáticas, existen no para cada objeto, sino por clase, por ello pueden ser llamadas sin que se haya instanciado un objeto de la clase. Informática II 2011/2 10

11 Informática II 2011/2 11 F UNCIONES MIEMBRO ESTÁTICAS class Cat{ public: //…Constructor, destructor, otros metodos static int GetHowMany() { return HowManyCats; } static int HowManyCats; }; int Cat::HowManyCats = 0; int main() { int howMany; Cat theCat; // define a cat howMany = theCat.GetHowMany(); // access through an object howMany = Cat::GetHowMany(); // access without an object }

12 Cuidado, las funciones miembro estáticas NO poseen un puntero this, ni tampoco pueden ser declaradas const. Como las funciones miembro utilizan el puntero this para acceder a las variables miembro, una función estática solo podrá acceder a los datos miembro que sean declarados estáticos. Informática II 2011/2 12 F UNCIONES MIEMBRO ESTÁTICAS

13 C ONTENIDO Informática II 2011/2 13 Variables miembro estáticas 1 Funciones miembro estáticas 2 Punteros a funciones 3 4 Arreglo de punteros a funciones

14 P UNTEROS A FUNCIONES Así como el nombre de un arreglo es un puntero constante al primer elemento del arreglo, el nombre de una función es un puntero constante a la función. Es posible declarar entonces una variable puntero que apunte a un función e invocar o llamar a la función original a través de él. Informática II 2011/2 14 Esto puede ser muy útil, al permitir crear programas que decidan qué función llamar basándose en la elección del usuario en tiempo de ejecución.

15 Un puntero a función debe apuntar siempre a una función con el mismo tipo de retorno y firma. Informática II 2011/2 15 P UNTEROS A FUNCIONES long (* funcPtr) (int); funcPtr : es declarado para ser un puntero que apunta a una función que toma un entero int como parámetro de entrada y retorna un long. El paréntesis al rededor de * funcPtr es necesario funcPtr : es declarado para ser un puntero que apunta a una función que toma un entero int como parámetro de entrada y retorna un long. El paréntesis al rededor de * funcPtr es necesario

16 Para asignar un puntero a una función, simplemente se iguala este al nombre de la función. Informática II 2011/2 16 P UNTEROS A FUNCIONES void (* pFunc) (int &, int &);//puntero a funcion void GetVals(int&, int&);//funcion pFunc = GetVals;//puntero a funcion getVals Para hacer el llamado a la función a través del puntero, simplemente use el puntero a función de la misma forma como usaría el nombre de la función pFunc(valOne, valTwo);//llamdo de la funcion

17 #include using namespace std; void Square (int&,int&); void Cube (int&, int&); void Swap (int&, int &); void GetVals(int&, int&); void PrintVals(int, int); Informática II 2011/2 17 P UNTEROS A FUNCIONES int main() { void (* pFunc) (int &, int &); bool fQuit = false; int valOne=1, valTwo=2; int choice; while (fQuit == false) { cout << "(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: "; cin >> choice; switch (choice) { case 1: pFunc = GetVals; break; case 2: pFunc = Square; break; case 3: pFunc = Cube; break; case 4: pFunc = Swap; break; default : fQuit = true; break; } if (fQuit) break; PrintVals(valOne, valTwo); pFunc(valOne, valTwo); PrintVals(valOne, valTwo); } return 0; } void PrintVals(int x, int y) { cout << "x: " << x << " y: " << y << endl; } void Square (int & rX, int & rY) { rX *= rX; rY *= rY; } void Cube (int & rX, int & rY) { int tmp; tmp = rX; rX *= rX; rX = rX * tmp; tmp = rY; rY *= rY; rY = rY * tmp; } void Swap(int & rX, int & rY) { int temp; temp = rX; rX = rY; rY = temp; } void GetVals (int & rValOne, int & rValTwo){ cout << "New value for ValOne: "; cin >> rValOne; cout << "New value for ValTwo: "; cin >> rValTwo; }

18 P UNTEROS A FUNCIONES Los punteros a funciones reducen código duplicado, clarifican el programa, y permite hacer tablas de funciones a llamar en tiempo de ejecución. Informática II 2011/2 18 // Listing 14.6 Without function pointers #include int main() { bool fQuit = false; int valOne=1, valTwo=2; int choice; while (fQuit == false) { cout << "(0)Quit (1)Change Values (2)Square(3)Cube (4)Swap: "; cin >> choice; switch (choice) { case 1: PrintVals(valOne, valTwo); GetVals(valOne, valTwo); PrintVals(valOne, valTwo); break; case 2: PrintVals(valOne, valTwo); Square(valOne,valTwo); PrintVals(valOne, valTwo); break; case 3: PrintVals(valOne, valTwo); Cube(valOne, valTwo); PrintVals(valOne, valTwo); break; case 4: PrintVals(valOne, valTwo); Swap(valOne, valTwo); PrintVals(valOne, valTwo); break; default : fQuit = true; break; } if (fQuit) break; } return 0; }

19 P ASANDO COMO ARGUMENTO A UNA FUNCIÓN, PUNTEROS A FUNCIONES Los punteros a funciones pueden ser pasados como argumentos a otras funciones, las cuales a su vez pueden llamar a otra función usando el puntero. Informática II 2011/2 19 #include using namespace std; void Square (int&,int&); void Cube (int&, int&); void Swap (int&, int &); void GetVals(int&, int&); void PrintVals(void (*)(int&, int&),int&, int&); int main() { int valOne=1, valTwo=2; int choice; bool fQuit = false; void (*pFunc)(int&, int&); while (fQuit == false) { cout << "(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: "; cin >> choice; switch (choice) { case 1:pFunc = GetVals; break; case 2:pFunc = Square; break; case 3:pFunc = Cube; break; case 4:pFunc = Swap; break; default:fQuit = true; break; } if (fQuit == true) break; PrintVals ( pFunc, valOne, valTwo); } return 0; } void PrintVals( void (*pFunc)(int&, int&),int& x, int& y) { cout << "x: " << x << " y: " << y << endl; pFunc(x,y); cout << "x: " << x << " y: " << y << endl; }

20 Se puede usar typedef para simplificar las definiciones de punteros a funciones Informática II 2011/2 20 P ASANDO COMO ARGUMENTO A UNA FUNCIÓN, PUNTEROS A FUNCIONES typedef void (*VPF) (int&, int&) ; VPF pFunc; VPF pFunc2; void (*pFunc3)(int&, int&); void (*pFunc4)(int&, int&);

21 P UNTEROS A MÉTODOS DE UNA CLASE Estos punteros a métodos se utilizan de la misma forma que los punteros a funciones, solo que necesitan un objeto de la clase correcta con el cual invocarlos. Para hacerlo se utiliza la misma declaración vista anteriormente pero se incluye el nombre de la función y el operador scope (::) antes del nombre del puntero. Hasta este momento todos los punteros han sido referenciados a funciones en general no incluidas en clases. También es posible crear punteros a funciones miembro de una clase. Informática II 2011/2 21

22 Informática II 2011/2 22 P UNTEROS A MÉTODOS DE UNA CLASE #include using namespace std; class Mammal { public: Mammal():itsAge(1) { } virtual ~Mammal() { } virtual void Speak() const = 0; virtual void Move() const = 0; protected: int itsAge; }; class Dog : public Mammal{ public: void Speak()const { cout << "Woof!\n"; } void Move() const { cout << "Walking...\n"; } }; class Cat : public Mammal { public: void Speak()const { cout << "Meow!\n"; } void Move() const { cout << "slinking...\n"; } }; class Horse : public Mammal { public: void Speak()const { cout << "Whinny!\n"; } void Move() const { cout << "Galloping...\n"; } }; int main() { void (Mammal::*pFunc)() const =0; Mammal* ptr =NULL; int Animal; int Method; bool fQuit = false; while (fQuit == false) { cout << "(0)Quit (1)dog (2)cat (3)horse: "; cin >> Animal; switch (Animal) { case 1: ptr = new Dog; break; case 2: ptr = new Cat; break; case 3: ptr = new Horse; break; default: fQuit = true; break; } if (fQuit) break; cout << "(1)Speak (2)Move: "; cin >> Method; switch (Method) { case 1: pFunc = Mammal::Speak(); break; default: pFunc = Mammal::Move(); break; } (ptr->*pFunc)(); delete ptr; } return 0; }

23 U SANDO A RREGLOS DE PUNTEROS A MÉTODOS DE UNA CLASE. Como los punteros a funciones, los punteros a funciones miembro pueden ser almacenados en arreglos. El arreglo puede ser inicializado con la dirección de varias funciones miembro, y estas pueden ser llamadas mediante el índice del arreglo. 1 Puede verse confuso en un principio, pero luego de creardo el vector, puede hacer el programa mucho más fácil de comprender y leer. 2 Informática II 2011/2 23 Llame los punteros referenciados a las funciones miembro de un objeto específico de una clase, usando typedef para hacer la definición de los punteros y las declaraciones más fácil de leer.

24 Informática II 2011/2 24 U SANDO A RREGLOS DE PUNTEROS A MÉTODOS DE UNA CLASE. //Listing 14.11 Array of pointers to member functions #include using namespace std; class Dog { public: void Speak()const { cout << "Woof!\n"; } void Move() const { cout << "Walking to heel...\n"; } void Eat() const { cout << "Gobbling food...\n"; } void Growl() const { cout << "Grrrrr\n"; } void Whimper() const { cout << "Whining noises...\n"; } void RollOver() const { cout << "Rolling over...\n"; } void PlayDead() const { cout << "Is this the end of Little dog?\n"; } }; typedef void (Dog::*PDF)()const ; int main() { const int MaxFuncs = 7; PDF DogFunctions[MaxFuncs] = { Dog::Speak, Dog::Move, Dog::Eat, Dog::Growl, Dog::Whimper, Dog::RollOver, Dog::PlayDead }; Dog* pDog =NULL; int Method; bool fQuit = false; while (!fQuit) { cout << "(0)Quit (1)Speak (2)Move (3)Eat (4)Growl"; cout << " (5)Whimper (6)Roll Over (7)Play Dead: "; cin >> Method; if (Method == 0) { fQuit = true; } else { pDog = new Dog; (pDog->*DogFunctions[Method-1])(); delete pDog; } } return 0; }

25 Informática II 2011/2 25

26 B IBLIOGRAFÍA Pagina de Referencia lenguaje C++: http://www.cplusplus.com/reference/std/ex ception/exception/http://www.cplusplus.com/reference/std/ex ception/exception/ http://www.cplusplus.com/reference/std/st dexcept/http://www.cplusplus.com/reference/std/st dexcept/ Sams Teach yourselft C++ in 21 days: http://newdata.box.sk/bx/c/htm/ch20.htm# Heading1 26 Informática II 2011/2

27 Informática II 2009/2 27


Descargar ppt "Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2."

Presentaciones similares


Anuncios Google