Problema de error CPtrList
//Me he encontrado con problemas similares antes, lo siguiente debería poder ayudarte
Un proyecto creado con MFC consta de muchos archivos y no puede estar arbitrariamente fuera de la clase como un programa general de C++. Definir variables globales. Si desea definir variables y funciones globales que puedan ser compartidas por varios archivos en el proyecto, debe utilizar algunos métodos especiales. De hecho, hay muchas formas de lograrlo; aquí solo se presentan dos métodos. ITPUB personal space`)kS3F1]2z?2e
ITPUB personal space_ V*Jv'xjpd
1. ¡Defínelo en la clase de aplicación
}! ~o2aV"u.C0ITPUB espacio personal Inicialice el programa, genere documentos, vea objetos, etc. Podemos definir las variables y funciones que necesitan acceso global como variables miembro y funciones miembro de esta clase para lograr el acceso global.
Vjg- yqZ7z0
D!T-fJ'n[.Y!?0 Estrictamente hablando, este tipo de variables y funciones no son globales, porque siguen siendo solo un miembro de la clase, pero porque somos muy Es fácil obtener el puntero de la clase CxxxApp, por lo que podemos acceder a ellos en documentos, vistas, cuadros de diálogo y varias clases personalizadas para lograr un efecto similar a las variables globales. Al acceder, use la función "AfxGetApp. ()" para obtener el puntero de la clase CxxxApp. , utilice "AfxGetApp()->Member" para acceder a variables o funciones.|&Q'l TA:JibRF
%Qv y F,Fn0 Ejemplo:
/_0u .YYd0ITPUB espacio personal 0K1If~_
Test.h: (Archivo de encabezado de clase de aplicación)
xt*N}_2~6[8N. y0ITPUB espacio personal, n/cx6` p%^q
clase CTestApp: pública CWinApp
^!o/E@U^O wbR(m h I0{
kY.B3~i5WFrP0 public :
pm'n7x7q0 int x; //Variable global
%Q vv0~Yn0 int f(int y); //Función global
'dV6aa [K3F2QW0R0…………
_8m&lk$\@"dV0}; espacio personal ITPUB)J{-va*_K6|.d/g.YX
ITPUB personal space_] I!IE&Z
Test.cpp: (archivo de programa de clase de aplicación) ITPUB personal space&F8c ` p)E&s.u
/n HnI @0int CTestApp: :f(int y ) //Definición de función global
R,?h$tH \ ~]0{
6g-bFd!Xj,Ent0 y++;
%x4G0I( z2J3}#b@{|0 return y; ITPUB espacio personal B f'\.ab wH%uT(A
} 9UK@:MD8?~0ITPUB espacio personal.KM9u) d4Q g
Se puede acceder a las variables y funciones definidas en la clase CTestApp en otras clases.
Por ejemplo, si desea acceder a la variable x y la función f() en una función de la vista: ITPUB personal space 1@8vSP2]do
:rq"UTp3kn0void CTestView::xyz()ITPUB personal space Y-Ar(g "]1l HhJ0d
{ ITPUB personal space 5Ir%yZ(A
CTestApp *app = (CTestApp *)AfxGetApp(); // Genera un puntero a la clase de aplicación ITPUB personal Space 3q jiWtpI:q p
app->x = 0; //Acceso a la variable x
_(DfeZO? kq0 int z = app->f( 1); // Función de acceso f() Espacio personal ITPUB 'P!oagg'd
…………Espacio personal ITPUB U[ILWeN4f$w
}
{ ^ .{1Xn%G0s;T0
@w`\G"Y)Y&S0 De esta forma, la variable x y la función f() pueden considerarse globales.
z/nA jH1m" S|)W0
H~! Necesita obtener el puntero de la clase de aplicación; y luego colocar algunas variables y funciones que no tienen nada que ver con la clase de aplicación. en sí, haciendo que la clase parezca extraña y destruyendo la encapsulación de la clase
" r j^-K0t"boK.e)QerB0ITPUB personal space*U}5n gBZ qoz#oc
. 2. Utilice variables estáticas y funciones estáticas para implementar
WO5SV3`rNaS0ITPUB espacio personal W@ s1r9NF @
Realmente me gusta el método de llamada de funciones API, sin importar en qué clase se encuentre. , puedes llamarlo con "::función API". Puedes lograr algo similar usando racionalmente tipos estáticos y funciones globales
ho D;@KU0ITPUB espacio personal D"E#. B? c-kN'\cb0b
Las variables estáticas y las funciones estáticas tienen las siguientes propiedades:
Kx9A_}'?'KGT-b0ITPUB espacio personal v(x7Z*^k5rg p>
Si se usa la palabra clave estática para declarar un miembro de datos en una clase, entonces solo habrá un miembro de datos Copiar, no importa cuántas instancias de esta clase se creen, siempre habrá solo una Incluso si. no se crea ninguna instancia de esta clase, seguirá existiendo. 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 la instancia de la clase puede no existir. *jP-Q$gN0ITPUB espacio personal&v2d5DV,KF'v6e
Las variables globales y funciones implementadas usando esta propiedad son muy cómodas de usar.
e!g|3nwrJ0ITPUB personal space 4s`&Ex l/dfh{
Vale la pena señalar que las variables globales y las funciones globales se encapsulan mejor de forma centralizada y no en documentos, vistas, etc. Definido internamente, para que tenga una sensación global cuando se use.
Espacio personal ITPUB A&qg/^:Zk:U
Espacio personal ITPUB 0tgG"H m
Ejemplo: espacio personal ITPUB;r[5Bn-Yx8F.md)L
8X Z? ~1myi0 1. Agreguemos una nueva clase sin una clase base. Llamemos a la clase CPublic y llamémosla clase pública
o&i)Z0F]\+S$I0
.!mlzMiN0 Haga clic en el comando "Nueva clase" en el menú "Insertar", seleccione "Tipo de clase" como "Clase genérica", complete el nombre de la clase "CPublic" en la columna "Nombre" y haga clic en "Aceptar". , se crea la nueva clase.
kg&aCL.i8L0ITPUB espacio personal bB? H!t!B,pcr
2. Incluya el archivo de encabezado de la clase pública para que cada clase pueda acceder a él
5@;|+Kid#W:U0
4L1|2Iy ~l.i4C'O6b0 El archivo de encabezado de CPublic debe incluirse en el archivo de encabezado de la aplicación class , por lo que no es necesario incluirlo al hacer referencia a la clase CPublic en otras clases.
Espacio personal ITPUB%[ol rjg0xr$t$?
Espacio personal ITPUB p? L$mmpJ5Jb
Test.h: (archivo de encabezado de clase de aplicación)espacio personal ITPUB)eB ? ?t;gp l3c \
Y5I]X!O0#include "Public.h" //Incluir archivos de encabezado de clase pública
_%htle0
U :@,r\PSH0class CTestApp : CWinApp pública
%hVLyDVQC0{
"Ul8|%ma/FJw0…………
M? p/? ,FF3\0}; ITPUB personal space (fLhS%y
khv;?2Bk0 3. Defina variables globales y funciones globales en clases públicas y utilice modificaciones estáticas. Las variables estáticas también deben definirse e inicializarse fuera de la clase
Mle9v#Q0
8v k8DP]^y0 Public.h: (Archivo de encabezado de clase pública)
r*_.C @hmt:T?0ITPUB espacio personalc fho Pij(WP:YM
class CPublicITPUB espacio personal/UB;WOcr
{
.zY/ of(dl5rC-yS4K0public: ITPUB personal? espacio #ypv k'U4ac#a~ J!B
CPublic();
8TT9i2AcIMP0virtual ~CPublic();
-H9W y \#aT0
}!p;Wp0a-r0public:
/y3uF1f m*ez:m m/pC}]0static int x; //Variables globales p>
7G3j0F0G&L9B+Z0static int tiempo; //variable global
T5W Z? I5_2R,z0static int f(int y); //función global
N9V,hx H1C$]5d0…………
`3BK a9b|J9H0} Espacio personal ITPUB 9vDv^BL!F%{
"T*ot-K.Uhw1N0 en la clase pública Inicialice variables estáticas y defina el cuerpo de la función: Espacio personal ITPUB,}5\J4l$h*s8\$}
O]|$iE8FJz!r0 Public.cpp: (Archivo de programa de clase pública)
v"h? e/^f U_5T.p!s0
%[X$I4GQ2`%F0int CPublic::x = 0; //Inicializar variables globales
+btgx9Ai0int CPublic::time; //Definir variable global espacio personal ITPUB n4e+bF |'t@;a,f
&]5~\(D!i'_4[+ R?p0CPublic::CPublic()
S4s#[a$h"m(A+A0{
BYjv"qC k0ITPUB espacio personali,m? xzL(Z
} ITPUB espacio personal y$IQ_G7 [Z&~"R"i.I
0n:_+C|uZ)a0CPublic::~CPublic()
/ U:P.O)JKdw0{ ITPUB espacio personal 8p!f4t( C%?P0z
Espacio personal ITPUB/]? Y ucZ1j6w
} Espacio personal ITPUB C1p8^hf&}qn7r
3H^Ost4O}$Q0int CPublic: :f(int y) //Función global, no agregue estática aquí ITPUB espacio personal)R h5g3r)]:T
D
{
f%S9OYm0y++; espacio personal de ITPUB? JV&v'I6QO
regresar y; espacio personal de ITPUB? } ITPUB espacio personal 4KCj_Gw)Vk u
Ds#lHS:[~!s1nb#[0 4. Uso de variables globales ITPUB espacio personal/g-J5H;AT"v
¡Espacio personal ITPUB!M'Ke*sv/_.{+p6b
Usar variables: CPublic::nombre de variable
q O1u0LX&S[5B"gf0ITPUB espacio personal S[% ~Z .CN4LE
Función de uso: CPublic::function ()ITPUB espacio personal H,g$RD)KQ
3xp"\)c%jni u.fK0 como en vista Variable de acceso x y la función f() en una determinada función:
#c9T}Qt*QB|ni2e@,c0
uC1L*Aw-q'YL.G0void CTestView:: xyz( )Espacio personal ITPUB B4Nyv7iV
{
5nQI^$Ix9e*vzZgu0CPublic::x = 0; //Variable de acceso al espacio personal xITPUB KH7~'x8Z-lq+T
CPublic::time = CPublic::f(1); //Función de acceso f()ITPUB espacio personal h sF%T%Z c'UW
…………ITPUB Espacio personal ;x!k8er;I5}c!Q~
}
W%Wk2H"nA"CT0
;mJ})M S*NW7S0 en Los métodos de acceder a x, time y f() en otras clases son los mismos p>m1A!MF0?.JL`x#~{0
b"rs'?^(V0 ① Dado que pueden existir variables estáticas. independientemente de la clase, no es necesario generar una instancia de la clase CPublic.
j*r%PE6`y)K tX1R0
5yR/zta\0 ② La definición y la 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. Espacio personal ITPUB YB+a aV%d d#r8~2V
Espacio personal ITPUB/u$E;GC;S o
③ Si la función estática necesita acceder a variables en el Clase pública, estas variables también deben ser estáticas. Porque las variables no estáticas no existirán sin crear una instancia.
Por ejemplo: ITPUB espacio personal Ac"_? @9b
2}8Or4WIXC e0class CPublic
LEeh1r5v,L0{ ITPUB espacio personal 5Z*mw Tm
público :
*E'?t1c%IB|vd'J0int x; //Variable interna ITPUB espacio personal oKA'{;N@ w
static int f(int y ) // Función global
2p$a(~gASAM]0{ITPUB espacio personal`3h6i/IXQ^$P9D
x++;
)H' ?9T&C[ 4BE}N^W0return x;
4o&K+Vzw(O8H0}; espacio personal ITPUB h}i8S&c:z6DTg.p3o
…………
D @s4{$}0};
z5c)L*\V0ITPUB espacio personal uG"a/d"m m{
Aunque x es miembro de la clase, si no se genera En instancias de la clase CPublic, habrá un problema de que la función f() existe pero la variable x no existe el espacio personal ITPUB ZO[!u? K)U
:y1dRC. ;g$g?_, gn0 En resumen, es una buena opción utilizar clases sin instancias para gestionar variables globales. Tiene las ventajas de una gestión centralizada y un uso sencillo. Por supuesto, a menos que sea especialmente necesario, es mejor. Utilice variables globales con moderación. Un buen programador nunca será descuidado. Un programa que abusa de las variables globales y está mal encapsulado le hará sufrir mucho durante la modificación y el mantenimiento.