Hatalar, hatalar, sorular - sayfa 1873

 
Stanislav Korotky :
En son sürümlerde, EA kodunu değiştirmenin ve yeniden derlemenin test kullanıcısı tarafından algılanmamasına neden olan bir hata vardı? Yeni ex5 varyantının teste başlaması için terminali kapatıp yeniden açmanız gerekiyor. Aksi takdirde, eski olan test edilir.
EA'yı düzenliyorum ve ya CTRL+F5 aracılığıyla ya da doğrudan test cihazında yeterli bir sonuç görüyorum.
 
fxsaber :
EA'yı düzenliyorum ve ya CTRL+F5 aracılığıyla ya da doğrudan test cihazında yeterli bir sonuç görüyorum.
Ctrl+F5 hata ayıklama mı yapıyor? Benim sorunum hata ayıklamayla değil, basit test için başlatmayla.
 
Stanislav Korotky :
Ctrl+F5 hata ayıklama mı yapıyor? Benim sorunum hata ayıklamayla değil, basit test için başlatmayla.
Görsel olmadan düzenlemeden sonra başlatıyorum - normlar.
 
fxsaber :

Özel bir kurucu ile gizli bir sınıf nesnesi nasıl oluşturulur?

Sızıntılar böyle oluyor

Böyle bir durumda yıkıcının nasıl aranacağı açık değildir. Singleton - bu değil.

Özel kurucuya sahip bir sınıfın nesnesi, yalnızca o sınıfın özel bir statik işlevi kullanılarak oluşturulabilir.

Şimdi derleyici sağladığınız koda küfretmese de, bu gelecekte düzeltilecektir.

Yıkıcıyı çağırmak için akıllı bir işaretçi kullanabilirsiniz.

Bu durumda, yıkıcı açık olmalıdır.

 
Koldun Zloy :

Özel kurucuya sahip bir sınıfın nesnesi, yalnızca o sınıfın özel bir statik işlevi kullanılarak oluşturulabilir.

Şimdi derleyici sağladığınız koda küfretmese de, bu gelecekte düzeltilecektir.

Önerilen statü bu durumda yöntem bir tür kendini aldatma olacaktır, çünkü aslında, bir kurucu olacaktır. Ve tabii ki çağrılması gerekecek.

Yıkıcıyı çağırmak için akıllı bir işaretçi kullanabilirsiniz.

Bu durumda, yıkıcı açık olmalıdır.

Akıllı işaretçi nedir?
 

Yapıcının özel olması gerektiğinden eminseniz, başka yolu yoktur.

Akıllı işaretçi, basit bir işaretçi içeren ve zamanında silinmesini sağlayan bir nesnedir.

 class MyClass
{
public :
   MyClass();
};

struct MyClassPtr
{
   MyClass* pMyClass;

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

Bu en kolay seçenektir.

Daha karmaşık akıllı işaretçiler de vardır.

Bu kitapta onlar hakkında çok iyi yazılmış: https://rsdn.org/res/book/cpp/cpp_real_programmers.xml

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

kodun derlenmesi için eksik olan şey:

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

bu varyantta 'var' yazıyor - struct üyesi tanımsız

not. neyin yanlış olduğunu anla

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


 
void* dilde hangi yapıdan?
 
fxsaber :
void* dilde hangi yapıdan?

arayüzler göründüğünde
 
Sergey Dzyublik :

arayüzler göründüğünde
Teşekkür ederim. Doğru, hemen bir hatayla karşılaştım
 struct PTR
{
   void * Ptr; // internal error #40
};