Operador público nuevo, eliminar operador privado: obtener C2248 & # 8220; no se puede acceder al miembro privado & # 8221; cuando se usa nuevo
-
10-07-2019 - |
Pregunta
Una clase ha sobrecargado a los operadores new
y delete
. new
es público, delete
es privado.
Al construir una instancia de esta clase, aparece el siguiente error:
pFoo = new Foo(bar)
example.cpp (1): error C2248: 'Foo: operador eliminar': no ??se puede acceder al miembro privado declarado en la clase 'Foo'
Pero aquí no hay una llamada para eliminar
, entonces, ¿qué está pasando en la mente retorcida del compilador? :)
- ¿Cuál es la razón del error?
- ¿Es posible resolver el problema sin recurrir a la función
CreateInstance
de un miembro?
Solución
Cuando haces new Foo ()
, ocurren dos cosas: primero se invoca operator new
para asignar memoria, luego un constructor para Foo
se llama. Si ese constructor arroja, ya que no puede acceder a la memoria ya asignada, el tiempo de ejecución de C ++ se encargará de pasarla al operador delete
apropiado. Es por eso que siempre debe implementar un operador eliminar
correspondiente para cada operador nuevo
que escriba y es por eso que debe ser accesible.
Como salida, puede hacer que ambos sean privados e invocar al operador new
desde una función miembro pública (como create ()
).
Otros consejos
Marque esto . En uno de los párrafos inferiores dice que nuevo requiere eliminar para ser accesible. Básicamente dice que solo puede crear objetos en el montón, si también puede eliminarlos nuevamente.
Según los estándares de C ++, cuando tiene una clase con asignación de memoria dinámica y se genera una excepción dentro del constructor, la memoria debe liberarse para evitar pérdidas de memoria.
Aquí ha definido su propio operador nuevo como público, pero eliminar es privado.
Entonces el compilador le dice que me dé acceso para eliminar el operador para que pueda evitar pérdidas de memoria si se genera alguna excepción en el constructor.
Si no define su operador de eliminación, entonces también el compilador dará un error y lo obligará a definirlo.
-
" 1.¿Cuál es la razón del error? "
La respuesta desbi es buena.
-
" 2. ¿Es posible resolver el problema sin recurrir a una función miembro CreateInstance? "
Sí Crear destructor privado.
Al llamar al operador new on class se usará también delete class si el constructor de la clase arroja una excepción.
Si su biblioteca no usa excepciones, puede deshabilitar las excepciones del compilador '' -fno-excepciones '', entonces el error ya no aparecerá. (En Visual Studio reside en '' C / C ++ '', '' Generación de código '', '' Habilitar excepciones de C ++ '' > '' No (-fno-excepciones) '')