Ошибки, баги, вопросы - страница 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
};