Red de conocimiento informático - Material del sitio web - ¿Cómo definir una variable global en MFC y cómo hacer referencia a ella?

¿Cómo definir una variable global en MFC y cómo hacer referencia a ella?

Un proyecto creado con MFC se compone de muchos archivos. No puede definir variables globales fuera de la clase a voluntad como los programas C comunes. Las variables y funciones del proyecto deben utilizar algunos métodos especiales. De hecho, hay muchas formas de lograrlo; aquí solo se presentan dos métodos.

1. Definida en la clase de aplicación

En los proyectos generados con MFC existe una clase llamada CxxxApp, la cual se deriva de la clase CWinApp. Esta clase realiza principalmente la inicialización de programas, generación de documentos, visualización de objetos, etc. Podemos definir variables y funciones que requieren acceso global como variables miembro y funciones miembro de esta clase para lograr el acceso global.

Estrictamente hablando, este tipo de variables y funciones no son globales, porque todavía son solo un miembro de la clase, pero como podemos obtener fácilmente el puntero de la clase CxxxApp, podemos usarlo en el documento y vista Se puede acceder a ellos en cuadros de diálogo y varias clases personalizadas para lograr efectos similares a las variables globales. Al acceder, use la función "AfxGetApp()" para obtener el puntero de la clase CxxxApp y use "AfxGetApp()-gt; miembro" para acceder a la variable o función.

Ejemplo:

Test.h: (archivo de encabezado de clase de aplicación)

clase CTestApp: CWinApp pública

{

Público:

int x; //Variable global

int f(int y); //Función global

…………< / p>

};

Test.cpp: (archivo de programa de clase de aplicación)

int CTestApp::f(int y) //Definición de función global

{

y;

return y;

}

Se puede acceder a las variables y funciones definidas en la clase CTestApp desde otros clases. Por ejemplo, si desea acceder a la variable x y la función f() en una función de la vista:

void CTestView::xyz()

{

CTestApp *app = (CTestApp *)AfxGetApp(); //Generar un puntero a la clase de aplicación

App-gt; //Acceder a la variable x

int z = app-gt ;f(1); //Accede a la función f()

…………

}

De esta manera, variable x y la función f() pueden verse como globales.

Aunque las variables globales y las funciones globales implementadas de esta manera son relativamente simples, también tienen desventajas: en primer lugar, el acceso no es conveniente y es necesario obtener el puntero de la clase de la aplicación cada vez; El segundo es combinar algunas con la aplicación. Las variables y funciones no relacionadas con la clase del programa en sí se colocan dentro, lo que hace que la clase parezca extraña y destruye la encapsulación de la clase.

2. Utilice variables estáticas y funciones estáticas para implementar

Me gusta mucho el método de llamada de las funciones API, sin importar en qué clase se encuentre, simplemente use "::función API". para llamarlo. El uso adecuado de tipos estáticos (estático) puede implementar variables globales y funciones globales similares a esta.

Las variables estáticas y las funciones estáticas tienen las siguientes propiedades:

Si se usa la palabra clave static para declarar un miembro de datos en una clase, solo habrá una copia del miembro de datos. independientemente de si se crea la clase No importa cuántas instancias haya, siempre habrá solo una, incluso si no se crea ninguna instancia de la clase, todavía existe.

Si se usa la palabra clave static para declarar una función en una clase, se puede acceder a la función usando "nombre de clase::nombre de función" sin hacer referencia a una instancia de la clase, o incluso a la instancia de la clase. puede que no exista.

Las variables globales y funciones implementadas usando esta propiedad son muy cómodas de usar.

Vale la pena señalar que las variables globales y las funciones globales se encapsulan mejor de forma centralizada y no deben definirse dentro de documentos, vistas, etc., para que tengan una sensación global cuando se usan.

Ejemplo:

1. Agregue una nueva clase sin una clase base, llamemos a la clase CPublic, llamémosla clase pública

Haga clic en " "Nuevo Comando Clase" en el menú "Insertar", seleccione "Tipo de clase" como "Clase genérica", complete el nombre de la clase "CPublic" en la columna "Nombre", haga clic en "Aceptar", se crea la nueva clase.

2. Contener el archivo de encabezado de la clase pública para que todas las clases puedan acceder a él.

El archivo de encabezado de CPublic debe incluirse en el archivo de encabezado de la clase de aplicación, para que en otros clases No es necesario incluirlo al hacer referencia a la clase CPublic.

Test.h: (archivo de encabezado de clase de aplicación)

#include "Public.h" //Incluye archivo de encabezado de clase pública

clase CTestApp: CWinApp pública

{

…………

};

3. Definir variables globales y funciones globales en la clase pública, ambas usando. modificación estática, las variables estáticas también deben definirse e inicializarse fuera de la clase

Public.h: (archivo de encabezado de clase pública)

clase CPublic

{

público:

CPublic();

virtual ~CPublic();

público:

static int x ; //Variable global

static int time; //Variable global

static int f(int y); //Función global

…………

}

Inicializar variables estáticas y definir cuerpos de funciones en clases públicas:

Public.cpp: (archivo de programa de clase pública)

int CPublic::x = 0; //Inicializar variables globales

int CPublic::time; //Definir variables globales

CPublic::CPublic()

{

}

CPublic::~CPublic()

{

}

int CPublic: :f(int y) // Función global, no agregue estática aquí

{

y

return y

}

4. Uso de variables globales

Usar variables: CPublic:: nombre de variable

Usar funciones: CPublic:: function ()

Si accedes a la variable x y la función f() en una función de la vista:

void CTestView::xyz()

{

CPublic ::x = 0; //Accede a la variable x

CPublic::time = CPublic::f(1); //Accede a la función f()

…………

}

Los métodos para acceder a x, time y f() en otras clases son los mismos.

5. Algunas notas:

① Dado que las variables estáticas pueden existir independientemente de las clases, no es necesario generar instancias de la clase CPublic.

② La definición e inicialización de miembros de datos estáticos debe realizarse fuera de la clase, como la inicialización de x en el ejemplo, aunque la variable tiempo no se inicializa, también debe definirse fuera de la clase. Dado que no se genera ninguna instancia de la clase CPublic, su constructor y destructor no se ejecutarán y no tiene sentido realizar ningún trabajo en ellos.

③ Si la función estática necesita acceder a variables dentro de la clase CPublic, estas variables también deben ser estáticas. Porque las variables no estáticas no existirán sin crear una instancia. Por ejemplo:

class CPublic

{

public:

int x //Variables internas

static int f(int y) //Función global

{

x

return x

}; >

…………

};

Aunque x es miembro de la clase, si no se genera una instancia de la clase CPublic, la función f() existe y la variable x no existe.

En resumen, utilizar una clase sin instancias para gestionar variables globales es una buena opción. Tiene las ventajas de una gestión centralizada y un uso sencillo. Por supuesto, a menos que sea particularmente necesario, es mejor usar variables globales con moderación. Un buen programador nunca abusará de las variables globales a voluntad. Un programa con una encapsulación deficiente le hará sufrir mucho durante la modificación y el mantenimiento.