Merhaba;
Soruya geçmeden önce C++17'den önce bir sınıfta static veri üyesi varsa ilk değeri sınıf dışında bir alanda atanmalı lakin C++17 ile birlikte inline ekleyerek static inline tür veriadi = değer diye sınıf içinde tanımlayabiliyoruz.
Implementation isminde bir soyut sınıfım var:
class Implementation
{
public:
virtual void call() = 0;
};
Bu sınıftan kalıtım yapan Example ve AnotherExample diye iki sınıf şöyle:
class Example : public Implementation
{
public:
void call() override
{
cout << "Example::call cagrildi!" << endl;
}
};
class AnotherExample : public Implementation
{
public:
void call() override
{
cout << "AnotherExample::call cagrildi!" << endl;
}
};
Ve bu sınıfları programcının uygulaması için Implementer adında bir sınıf da şu şekilde:
(Bu sınıfın get_example üye fonksiyonuna geçilen flag eğer doğru ise example üye verisi, eğer yanlış ise another_example veri üyesi geri döndürülecek.)
class Implementer
{
private:
static inline Implementation* example = unique_ptr<Example>(new Example).get();
static inline Implementation* another_example = new AnotherExample; // make_unique<AnotherExample>().get();
public:
static Implementation* get_example(bool flag)
{
if (flag)
return example;
else
return another_example;
}
};
Şöyle kullanalım:
Implementer::get_example(true)->call(); // example'ı kullanmalı.
Implementer::get_example(false)->call(); // Another_example'ı kullanmalı.
Çıktının
Example::call cagrildi!
AnotherExample::call cagrildi!
şeklinde olması gerekirken garip bir şekilde şöyle oluyor:
AnotherExample::call cagrildi!
AnotherExample::call cagrildi!
Şu iki satırda problem var:
static inline Implementation* example = unique_ptr<Example>(new Example).get();
static inline Implementation* another_example = new AnotherExample;
Eğer example'a new Example şeklinde bellek ayırırsam çıktı doğru oluyor ama yukarıdaki şekilde veya make_unique().get() şeklinde bellek ayırırsam çıktı iki tane "AnotherExample çağrıldı" oluyor. Eğer example'ı şöyle tanımlarsam
static inline unique_ptr<Example> example = make_unique<Example>();
doğru çıktı basıyor. Eğer iki tanımı da make_unique ile tanımlarsam program hata vermiyor, bir süre bekliyor ve sonra PRESS ENTER KEY'e düşüyor. Bu neden kaynaklanıyor olabilir? Problem çok garip geldi. Hata vermiyor, uyarı vermiyor ama garip bir şekilde altta tanımlı olan another_example'ın değeri yukarısında bulunan example'a da veriliyor.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]