[C con Clase] Tener una clase con miembros accesibles en cualquier archivo de la aplicación.

Davidson, Steven srd4121 en njit.edu
Lun Abr 25 08:33:17 CEST 2016


Hola Marcelinux,

Para agrupar entidades, puedes usar espacios denominados (namespaces, en
inglés), aunque la preparación es básicamente la misma que has hecho,
excepto que creas tu propio ámbito. Por ejemplo,

// main.cpp

namespace ns
{
int global1;
float global2;
std::string global3;
}

int main()
{
  ns::global1 = 123;
  ns::global2 = 123.45f;
  ns::global3 = "cadena global en 'ns'";

  std::cout << "global1 = " << ns::global1 << std::endl;
  std::cout << "global2 = " << ns::global2 << std::endl;
  std::cout << "global3 = " << ns::global3 << std::endl;

  Clase miClase;
  miClase.mostrar();

  return 0;
}


// clase.cpp

namespace ns
{
extern int global1;
extern float global2;
extern std::string global3;
}

void Clase::mostrar()
{
  std::cout << "Valor de global1 desde el espacio denominado: " <<
ns::global1 << std::endl;
  std::cout << "Valor de global2 desde el espacio denominado: " <<
ns::global2 << std::endl;
  std::cout << "Valor de global3 desde el espacio denominado: " <<
ns::global3 << std::endl;
}


Si de verdad quieres usar una clase, entonces sólo debes definir los
miembros como estáticos; esto es,

// main.cpp

int Clase::global1;
float Clase::global2;
std::string Clase::global3;

int main()
{
  Clase::global1 = 123;
  Clase::global2 = 123.45f;
  Clase::global3 = "cadena global";
  std::cout << "global1 = " << Clase::global1 << std::endl;
  std::cout << "global2 = " << Clase::global2 << std::endl;
  std::cout << "global3 = " << Clase::global3 << std::endl;

  Clase miClase;
  miClase.mostrar();

  return 0;
}


// clase.cpp

void Clase::mostrar()
{
  std::cout << "Valor de global1 desde la clase: " << Clase::global1 <<
std::endl;
  std::cout << "Valor de global2 desde la clase: " << Clase::global2 <<
std::endl;
  std::cout << "Valor de global3 desde la clase: " << Clase::global3 <<
std::endl;
}


Espero que esto te sirva.

Steven


2016-04-24 15:32 GMT-04:00 marcelinux <marcelinator en gmail.com>:

> Hola.
> La idea es tener una clase con miembros accesibles en cualquier archivo de
> la aplicación.
>
> Imaginemos que tengo una aplicación en la que necesitaré unas variables
> globales.
> Cuando digo globales, no me refiero al mismo archivo, sino a todos los
> archivos de la aplicación.
> Por ejemplo: En el archivo main.cpp declaro unas variables globales.
> En otro archivo donde se define una clase, quiero usar aquellas globales.
> Para ello, declararía las globales con extern.
> Lo haría más o menos así:
>
> Archivo main.cpp
> // Usar variables en otro archivo
> #include <iostream>
> #include <string>
> #include "clase.h"
>
> // Definir las variables globales
> int global1;
> float global2;
> std::string global3;
>
> int main()
> {
>     std::cout << "Asignar valores a las variables globales." << std::endl;
>     global1 = 123;
>     global2 = 123.45;
>     global3 = "cadena global";
>     std::cout << "global1 = " << global1 << std::endl;
>     std::cout << "global2 = " << global2 << std::endl;
>     std::cout << "global3 = " << global3 << std::endl;
>
>     // Accedemos a la clase donde operaremos con las variables globales
>     Clase miClase;
>     miClase.mostrar();
>
>     return 0;
> }
>
> Archivo clase.h
> #ifndef CLASE_H
> #define CLASE_H
> // Clase.
> // Mostrará las variables globales externas
> class Clase
> {
>     public:
>         void mostrar();
> };
> #endif // CLASE_H
>
> Archivo clase.cpp
> // Definición de Clase
> #include <iostream>
> #include <string>
> #include "clase.h"
>
> extern int global1;
> extern float global2;
> extern std::string global3;
>
> void Clase::mostrar()
> {
>     std::cout << "Valor de global1 desde la clase: " << global1 <<
> std::endl;
>     std::cout << "Valor de global2 desde la clase: " << global2 <<
> std::endl;
>     std::cout << "Valor de global3 desde la clase: " << global3 <<
> std::endl;
>     return;
> }
>
> Y la pregunta es:
> ¿Cómo podría "agrupar" esas variables en una "struct" o "class"?
> Si hago algo como extern class varGlobales;
> el compilador me devuelve un error: a storage class can only be specified
> for objects and functions
>
> Mi compilador es g++ (Debian 5.3.1-14) 5.3.1 20160409
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20160425/b1712b51/attachment.html>


Más información sobre la lista de distribución Cconclase