2013-03-13 20 views
9

Kullanıma bağlı olarak bazen fazladan durum bilgileri depolaması gereken genel bir sınıf myClass var. Bu normalde bir void* ile yapılır, ancak bir std::unique_ptr<void, void(*)(void*)> kullanıp kullanamayacağımı merak ediyorum, böylece sınıf örneği imha edildiğinde bellek otomatik olarak serbest bırakılır. Sorun şu ki, bir void * silme tanımlanmamış davranışla sonuçlanırken özel bir deliciyi kullanmak zorundayım.std :: unique_ptr <void>'u bir akıllı boşluk gibi özel bir silme kullanarak *

Varsayılan olarak bir std::unique_ptr<void, void(*)(void*)> oluşturmak için bir yol var mı, bu yüzden ben ilk önce bir kukla silme ile inşa etmem, daha sonra bir durum yapısı için void* kullandığımda gerçek bir delici ayarlamak? Veya devlet bilgisini bir sınıfta saklamanın daha iyi bir yolu var mı? Muhtemelen

void dummy_deleter(void*) { } 

class myClass 
{ 
public: 
    myClass() : m_extraData(nullptr, &dummy_deleter) { } 
    // Other functions and members 
private: 
    std::unique_ptr<void, void(*)(void*)> m_extraData; 
}; 
+7

Şablonlarımız varken 'void' işaretçileri için gerçekten çok fazla kullanım yok. –

+3

Bu bir [xy problemi] gibi geliyor (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – Pubby

+0

Burada "unique_ptr" olmasını ve "shared_ptr" olmasını istemediğinden emin misiniz? –

cevap

6

sanal yıkıcının ile bir arayüz IAdditionalData sahip olacaktır ek bilgileri depolamak için daha sezgisel bir yol: Burada

bazı örnek kodudur. Ne tür veri yapılarına sahip olabilirsiniz, IAdditionalData'dan devralınacak ve std::unique_ptr<IAdditionalData>'da saklanacaktır.

Bu, ayrıca, daha fazla türde bir güvenlik sağlar; örneğin, ItalditionalData ile gerçek tür arasında, void * arasındaki reinterpret_cast ve herhangi bir veri türü yerine, statik olarak yayınlanır.

+0

Void * ile hedef türü arasında static_cast yapabilirsiniz. –

+0

@ R.MartinhoFernandes void * ile herhangi bir tür arasında static_cast yapabilirsiniz. Hiçbir tip güvenlik garantisi sunar. Bir arayüzün aksine. IAdditionalData'dan SomeDerivedAdditionalData'ya ait –

+0

static_cast, SomeDerivedAdditionalData için void * 'den çok daha güvenli değildir (en azından önemli bir şekilde). –

İlgili konular