Static Members of a Class


Static variables of a class

Each object of a class has its own member variables, and these variables cannot be seen or altered by other objects of the same class. A static variable of a class is a variable that is shared by all objects of the same class. A member static variable allows sharing resources among objects of the same class, for instance in the following problem when the number of connections is zero it is possible to allocate a matrix with data that all MyConnections object shares; when the last object of this class is destroyed (count = 0) this data matrix must be destroyed.
Cada objeto de una clase tiene sus propias variables miembro, y estas variables no pueden ser vistas o alteradas por otros objetos de la misma clase. Una variable estática de una clase es una variable que es compartida por todos los objetos de la misma clase. Las variables estáticas miembros permiten compartir recursos entre los objetos de una clase, por ejemplo en el programa siguiente cuando el número de conexiones es cero se puede crear una matriz de datos que todos los objetos de MyConnection comparten; cuando el último objeto de esta clase se destruye (count = 0) esta matriz de datos se debe destruir.

Problem 1
Add the MyConnection class to the Space program. All MyConnection objects must know the number of objects created of this class.
Agregue la clase MyConnection al programa Space. Todos los objetos MyConnection deben conocer el número de objetos creados de esta clase.

MyConnection.h
#pragma once
class MyConnection
{
public:
     MyConnection(void);
     ~MyConnection(void);
     static int count;
};

MyConnection.cpp
#include "StdAfx.h"
#include "MyConnection.h"

int MyConnection::count = 0;

MyConnection::MyConnection(void)
{
     // if (count == 0)
     //{
     //     Build something for all objects
     //}
     count++;
}

MyConnection::~MyConnection(void)
{
     count--;
     // if (count == 0)
     //{
     //     Destroy data shared by all objects
     //}
}

Space.cpp
...

void Space::Window_Open(Win::Event& e)
{
     MyConnection x, y;
     tbxOutput.Text += Sys::Convert::ToString(x.count);
     tbxOutput.Text += L", ";
     tbxOutput.Text += Sys::Convert::ToString(y.count);
     tbxOutput.Text += L", ";
     if (5 > 0)
     {
          MyConnection z;
          tbxOutput.Text += Sys::Convert::ToString(x.count);
          tbxOutput.Text += L", ";
     }
     tbxOutput.Text += Sys::Convert::ToString(y.count);
     tbxOutput.Text += L", ";
     MyConnection z[10];
     tbxOutput.Text += Sys::Convert::ToString(z[5].count);
}


Tip
A static member variable CANNOT be initialized in the constructor; it must be initialized as shown in the previous code.
Una variable estática NO PUEDE inicializarse en el constructor; ésta debe ser inicializada como se muestra en el código previo.

Static functions of a class

A static function of a class:
  • has no access to any member functions or variables of a class
  • has access only to static member variables of a class
  • can be called WITHOUT creating an object of the class

Una función estática de una clase:
  • no tiene acceso a las variables o funciones miembro de la clase
  • tiene acceso solamente a variables estáticas miembro de una clase
  • puede ser llamada sin necesidad de crear un objeto de la clase

Problem 2
Add the IsOpen() static function to the class MyConnection as shown. The function must return true, if there is one or more objects created. Note how static functions are called.
Agregue la función estática IsOpen() a la clase MyConnection como se muestra. La función debe regresar verdadero, si hay uno o más objetos creados. Observe como las funciones estáticas son llamadas.

MyConnection.h
#pragma once
class MyConnection
{
public:
     MyConnection(void);
     ~MyConnection(void);
     static int count;
     static bool IsOpen();
};
MyConnection.cpp
#include "StdAfx.h"
#include "MyConnection.h"

int MyConnection::count = 0;

MyConnection::MyConnection(void)
{
     count++;
}

MyConnection::~MyConnection(void)
{
     count--;
}

bool MyConnection::IsOpen()
{
     return (count>0);
}

Space.cpp
...

void Space::Window_Open(Win::Event& e)
{
     if (MyConnection::IsOpen() == true) tbxOutput.Text += L"1. Open\r\n";
     MyConnection x;
     if (MyConnection::IsOpen() == true) tbxOutput.Text += L"2. Open\r\n";
}


Tip
A class with only static member functions must have a private constructor to tell the programmer that an object of this class is not necessary to call the functions.
Una clase con solamente funciones miembro estáticas debe tener un constructor privado para indicar al programador que un objeto de esta clase no es necesario para llamar las funciones.

Tip
  • Local variable is a variable that is created at the moment that the function is called and it is destroyed when the function ends
  • Member variable is variable proper of a class that can be used from any member function of the class keeping its value.
  • Static local variable is a special kind of local variable that keeps its value among calls to the same function. Note that it is not possible to use this variable outside the function.
  • Static member variable, If the variable is private, this can be used for any instance of the class, i.e, it is possible to know how many objects of the class exist. However, if the member variable is public, this is variable is practically a global variable.

  • Variable local Es una variable que se crea en el momento que la función se manda llamar y se destruye en el momento de finalizar la función.
  • Variable miembro Es una variable propia de una clase que puede accederse desde cualquier función miembro de la clase manteniendo su valor.
  • Variable local estática Son un tipo especial de variable local que permite conservar el valor entre llamadas a la misma función. Cabe aclarar que no es posible usar esta variable afuera de la función.
  • Variable miembro estática, Si la variable es privada está puede usada por todas las instancias de la clase, por ejemplo es posible saber cuántos objetos de esa clase hay. Sin embargo, si la variable miembro estática es pública es prácticamente una variable global y debe usarse con extremo cuidado.

© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home