Errores, fallos, preguntas - página 1873

 
Stanislav Korotky:
En las últimas versiones, ¿se ha corregido el error de que el probador no detecta los cambios y la recompilación del código de EA? Tengo que cerrar y volver a abrir el terminal para que la nueva versión de ex5 empiece a probar. En caso contrario, se comprueba la variante antigua.
Edito el Asesor Experto y con CTRL+F5, o directamente en el Probador de Estrategias veo el resultado adecuado.
 
fxsaber:
Edito el Asesor Experto y ya sea a través de CTRL+F5 o directamente en el probador veo resultados adecuados.
Ctrl+F5 es la depuración, ¿no? Mi problema no es con la depuración, sino con la ejecución de una simple prueba.
 
Stanislav Korotky:
Ctrl+F5 es la depuración, ¿no? Mi problema no es con la depuración, sino con la ejecución de una simple prueba.
Sin visuales corro después de las ediciones - bien.
 
fxsaber:

¿Cómo puedo crear un objeto de clase oculta con un constructor cerrado?

Así es como llegan las filtraciones.

No está claro cómo llamar a un destructor en esta situación. Singleton no lo es.

Un objeto de clase con un constructor cerrado sólo puede crearse utilizando una función estática especial de esa clase.

Aunque actualmente el compilador no jura el código que has citado, esto se arreglará definitivamente en el futuro.

Puedes utilizar un puntero inteligente para llamar al destructor.

El destructor debe estar abierto.

 
Koldun Zloy:

Un objeto de una clase con un constructor cerrado sólo puede crearse utilizando una función estática especial de esa clase.

Aunque el compilador no está actualmente maldiciendo el código que citaste, esto será definitivamente arreglado en el futuro.

El método estático propuesto en este caso será una especie de autoengaño, porque será un constructor en esencia. Tendrá que llamarlo explícitamente.

Puedes utilizar un puntero inteligente para llamar al destructor.

El destructor debe estar abierto.

¿Qué es un puntero inteligente?
 

Si estás seguro de que el constructor debe ser privado, no hay otra manera.

Un puntero inteligente es un objeto que contiene un puntero simple y asegura que se elimina a tiempo.

class MyClass
{
public:
   MyClass();
};

struct MyClassPtr
{
   MyClass* pMyClass;

   MyClassPtr( MyClass* myClass ) : pMyClass( myClass )
   {
   }
   ~MyClassPtr()
   {
      delete pMyClass;
   }
};

Esta es la opción más sencilla.

También hay punteros inteligentes más complejos.

Está muy bien escrito sobre ellos en este libro: https://rsdn.org/res/book/cpp/cpp_real_programmers.xml

C++ : библиотека программиста
  • rsdn.org
Глава 5. Умные указатели Глава 6. Ведущие указатели и дескрипторы Глава 7. Грани и другие мудрые указатели Глава 8. Коллекции, курсоры, итераторы Глава 9. Транзакции и гениальные указатели
 

lo que falta para que el código sea compilado:

class CMyClass
  {
public:
   void* core;
   CMyClass(void) : core(NULL) { }
   template<typename T>
   void Create(T* a_ptr) {
      core = dynamic_cast<T *> (a_ptr);
   }
  };

class CCore
  {
public:
   int var;
   CCore(void) : var(3) { }
  };


int OnInit() {
   CCore *_point_1 = new CCore();
   CMyClass _obj;
   _obj.Create(_point_1);
   int _val = _obj.core.var;
   
   delete _point_1;
//---
   return INIT_SUCCEEDED;
}

esta variante escribe 'var' - miembro struct indefinido

PS. Tengo el error ))

int _val = dynamic_cast <CCore *>(_obj.core).var;


 
void* a partir de qué construcción en el lenguaje?
 
fxsaber:
void* desde que se construye en el lenguaje?

es cuando aparecen las interfaces
 
Sergey Dzyublik:

cuando llegaron las interfaces.
Gracias. Sin embargo, el error me aparece de inmediato
struct PTR
{
  void* Ptr; // internal error #40
};