Ошибки, баги, вопросы - страница 1873

 
Koldun Zloy:

Объект класса с закрытым конструктором можно создать только при помощи специальной статической функции этого класса.

Хотя сейчас компилятор не ругается на код, который Вы привели, в будущем это обязательно исправят.

Предложенный стат. метод в таком случае будет некоторым самообманом, т.к. по сути он и будет являться конструктором. И его явно надо будет вызывать.

Для того чтобы вызвать деструктор можно использовать умный указатель.

При этом деструктор должен быть открытым.

Что такое умный указатель?
[Удален]  

Если Вы уверены, что конструктор должен быть закрытым, то по другому никак.

Умный указатель это объект, который содержит в себе простой указатель и обеспечивает его своевременное удаление.

class MyClass
{
public:
   MyClass();
};

struct MyClassPtr
{
   MyClass* pMyClass;

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

Это самый простой вариант.

Бывают и более сложные умные указатели.

Очень хорошо про них написано в этой книге:  https://rsdn.org/res/book/cpp/cpp_real_programmers.xml

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

чего не хватает, что бы скомпилировался код:

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;
}

в данном варианте пишет 'var' - struct member undefined

PS. понял в чем ошибка ))

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


 
void* с какого билда в языке?
 
fxsaber:
void* с какого билда в языке?

тогда, когда и интерфейсы появились
 
Sergey Dzyublik:

тогда, когда и интерфейсы появились
Спасибо. Правда, сразу нарвался на ошибку
struct PTR
{
  void* Ptr; // internal error #40
};
 
Koldun Zloy:

Если Вы уверены, что конструктор должен быть закрытым, то по другому никак.

Умный указатель это объект, который содержит в себе простой указатель и обеспечивает его своевременное удаление.

Это самый простой вариант.

Бывают и более сложные умные указатели.

Очень хорошо про них написано в этой книге:  https://rsdn.org/res/book/cpp/cpp_real_programmers.xml

Спасибо! Пробовал различные варианты, но не выходит никак
template <typename T>
struct PTR
{
  T* Ptr;
  
  PTR( void )
  {
  }
  
  void operator =( T* &Value )
  {
    this.Ptr = Value;
  }
  
  ~PTR( void )
  {
    Print(__FUNCSIG__);
    delete this.Ptr;
  }
};

class CLASS
{
private:
  static CLASS* Tmp;
  static PTR<CLASS> Ptr;
  
  CLASS()
  {
    CLASS::Ptr = CLASS::Tmp;
  }
};

static CLASS* CLASS::Tmp = new CLASS;
static PTR<CLASS> CLASS::Ptr;

void OnStart()
{
}

Собственно, логично, что не выходит. Заставить вызываться деструктор умного указателя раньше деструктора класса нельзя.

 

Компилятор вместо указания ошибки и места, где она возникает, выдает неопределенный internal error #112

class CLASS {};

template <typename T>
class CLASS2
{
public:
  static void Func() {}
};

void OnStart()
{
  CLASS2<CLASS>::Func;  
}
[Удален]  
fxsaber:
Спасибо! Пробовал различные варианты, но не выходит никак

Собственно, логично, что не выходит. Заставить вызываться деструктор умного указателя раньше деструктора класса нельзя.


Попробуйте так:

template < typename T >
struct PTR
{
  T* Ptr;
  
  PTR( T* Value ) : Ptr( Value )
  {
  }
  
  ~PTR()
  {
    Print(__FUNCSIG__);
    delete Ptr;
  }
};

class CLASS
{
private:
  static PTR< CLASS > Ptr;
  
public:
  CLASS()
  {
      Print(__FUNCSIG__);
  }
  ~CLASS()
  {
      Print(__FUNCSIG__);
  }
};

static PTR< CLASS > CLASS::Ptr( new CLASS );

void OnStart()
{
}

Уж не знаю, что Вы такое делаете, но в MQL делать конструктор закрытым, имеет смысл только для синглтона.

 
Koldun Zloy:

Попробуйте так:

Спасибо за подробный пример! К сожалению, в нем конструктор не закрытый. С закрытым, конечно, не получается так.

Мне нужно, чтобы существовал скрытый от всех объект. При этом другой объект такого типа нельзя было никак создать.