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

 
Stanislav Korotky:
В последних билдах правили ошибку, что изменение кода эксперта и его перекомпиляция не подхватываются тестером? Приходится закрывать и вновь открывать терминал, чтобы новый вариант ex5 начал тестироваться. Иначе тестируется старый.
Правлю советник и либо через CTRL+F5, либо напрямую в тестере вижу адекватный результат.
 
fxsaber:
Правлю советник и либо через CTRL+F5, либо напрямую в тестере вижу адекватный результат.
Ctrl+F5 это ж отладка? У меня проблема не с отладкой, а запуском на простое тестирование.
 
Stanislav Korotky:
Ctrl+F5 это ж отладка? У меня проблема не с отладкой, а запуском на простое тестирование.
Без визуалки запускаю после правки - норм.
 
fxsaber:

Как создать скрытый объект класса с закрытым конструктором?

Так идут утечки

Не ясно, как в такой ситуации вызвать деструктор. Singleton - не то.

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

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

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

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

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