2014-09-25 19 views
5

Özellikle ++ shared_ptr, C++ 11 özellikleri hakkında bilgi alıyorum ve this için başvuruda bulunarak ve diğer sınıflar için başvuru olarak kullanmakta sorun yaşıyorum."Bu" bir paylaşımlı_ptr olarak mı atıfta bulunuluyor?

Bunu yapmamın nedeni, simulasyondaki diğer örneklere (örn. Apple) geçirilen bir Simulation örneğidir, böylece simülasyonu kendileri değiştirebilirler, hatta kendilerini simülasyondan kaldırabilirler. Benim daha karmaşık kodu

ben from here anladığım kadarıyla aynı ham nesne üzerinde iki kez shared_ptr oluşturmamalıdır bir double free hatası (program yoksa) olsun. Simülasyon sınıfının this zaten bir shared_ptr olduğunu bilmediğinde this nesnesine shared_ptr nesnesine nasıl geçebilirim?

Benim düşünce başlatma argüman shared_ptr geçmektir ama bu

// The argument is a std::shared_ptr<Simulation> 
simulation->initSomethingElse(simulation); 

Belki alışılmadık desende bu uygulamaya çalışıyorum, ya da belki benim anlayış çok doğru değildir, ör .: gereksiz görünüyor? Belki bunun yerine daha güzel bir yolu var mı?

#include <memory> 

class Simulation; 

class Apple { 
public: 
    void init(std::shared_ptr<Simulation> simulation) { 
     this->simulation = simulation; 
    }; 

private: 
    std::shared_ptr<Simulation> simulation; 

}; 


class Simulation { 
public: 
    void initSomethingElse() { 
     auto apple = std::shared_ptr<Apple>(new Apple()); 

     // incorrect second reference to the raw pointer 
     apple->init(std::shared_ptr<Simulation>(this)); 
    }; 
}; 


int main() { 

    auto simulation = std::shared_ptr<Simulation>(new Simulation()); 
    simulation->initSomethingElse(); 

    return 0; 
} 
+0

'shared_ptr 'örneklerini nerede yok ediyorsunuz? Sadece son cümle için – Dai

cevap

8

akla gelen ilk şey kullanmaktır enable_shared_from_this: http://en.cppreference.com/w/cpp/memory/enable_shared_from_this

Ama akla gelen ikinci şey Simülasyon Apple ömrünü yönetebilmelidir, bu yüzden Apple ömrünü yönetmek gerek olmamasıdır Simülasyon Bu nedenle, Apple'ın shared_ptr<Simulation> - sadece main() tutmasını veya bazı yüksek düzey işlevlerin Simülasyonun ömrünü yönetmesini sağlamanız daha iyi olacaktır.

Dikkatli değilseniz, döngüsel referanslarla sonuçlanacaksınız. C++ 11'deki her işaretçinin bir shared_ptr olması gerektiğini varsaymayın.

+0

+1 – James

1

Kullanım enable_shared_from_this böylece nesne üzerinde bir fonksiyon kendisine yeni bir shared_ptr oluşturabilirsiniz:

aşağıda basitleştirilmiş bir örnek var. Bunu, Simulation'a bir shared_ptr ikincisatırı oluşturmak yerine yapmak isteyeceksiniz. Ayrıca apple shared_ptr bir yere rturn veya kaydetmek istediğinizde, sadece initSomethingElse() çalışıyor, ancak çok yararlı görünmüyor gibi çalışıyor ...?

İlgili konular