bir nesnenin yığın ayırma önlenmesi ve sadece yığın 'yeni' ile instiated izin vermek için mümkün mi?Nesnenin yığın ayırmasını önlemek ve yalnızca 'yeni' ile sonuçlanmasına izin vermek mümkün mü?
cevap
Bunu yapmanın bir yolu, kurucuları özel yapmak ve yalnızca bir işaretçi döndüren statik bir yöntemle yapılaşmaya izin vermek olabilir. Örneğin:
class Foo
{
public:
~Foo();
static Foo* createFoo()
{
return new Foo();
}
private:
Foo();
Foo(const Foo&);
Foo& operator=(const Foo&);
};
+ 1 kopyalanamaz hale getirmek için hatırlamak için. –
Ya da daha iyisi bir std ::
** İlgili soru: [Bir sınıfın 'yeni' operatör aracılığıyla ayrılmasını nasıl önleyebilirim? (Benim RAII sınıfı hep yığını üzerinde tahsis edilir sağlamak istiyorum.)] (Http://stackoverflow.com/questions/124856/how-do-i-prevent-a-class-from-being-allocated- Yeni-kullanıcı-kimliği-gibi) –
Sen yapıcı private
ardından nesneleri oluşturmak için bir public
statik fabrika yöntem sağlar yapabiliriz.
Bir nesne için soyut bir arayüz sağlar başlık dosyası ve öbek üzerinde oluşturulan nesnelere işaretçileri dönmek fabrika fonksiyonlarını oluşturabilir. C++ 11
class Foo
{
public:
~Foo();
static Foo* createFoo()
{
return new Foo();
}
Foo(const Foo &) = delete; // if needed, put as private
Foo & operator=(const Foo &) = delete; // if needed, put as private
Foo(Foo &&) = delete; // if needed, put as private
Foo & operator=(Foo &&) = delete; // if needed, put as private
private:
Foo();
};
halka kurucular izin verir ve zamanında atarak yığın tahsisleri durdurulur. Not thread_local
, bir C++ 11 anahtar sözcüğüdür. Ayrıca okuyucu için ilginç olabilir
class NoStackBase {
static thread_local bool _heap;
protected:
NoStackBase() {
bool _stack = _heap;
_heap = false;
if (_stack)
throw std::logic_error("heap allocations only");
}
public:
void* operator new(size_t size) throw (std::bad_alloc) {
_heap = true;
return ::operator new(size);
}
void* operator new(size_t size, const std::nothrow_t& nothrow_value) throw() {
_heap = true;
return ::operator new(size, nothrow_value);
}
void* operator new(size_t size, void* ptr) throw() {
_heap = true;
return ::operator new(size, ptr);
}
void* operator new[](size_t size) throw (std::bad_alloc) {
_heap = true;
return ::operator new[](size);
}
void* operator new[](size_t size, const std::nothrow_t& nothrow_value) throw() {
_heap = true;
return ::operator new[](size, nothrow_value);
}
void* operator new[](size_t size, void* ptr) throw() {
_heap = true;
return ::operator new[](size, ptr);
}
};
bool thread_local NoStackBase::_heap = false;
Scott Meyers'in de belirttiği gibi "Madde 11: Silinen işlevleri özel tanımlanmamış olanlara tercih et." "Etkili Modern C++" adlı kitabı, silinen üye işlevlerini "public" ilan etmek daha iyi. --QUOTE-- "Geleneksel olarak, silinen fonksiyonlar' kamuoyunu değil, 'private' ilan edilir. Istemci kodu üyesi işlevini kullanmaya çalışır Bunun bir sebebi. Orada, C + + kontroller erişilebilirlik önce silinen durum. Ne zaman müşteri kodu silinen 'private' işlevini kullanmayı dener, bazı derleyiciler işlevinin erişilebilirliğinin gerçekten kullanılıp kullanılamayacağını etkilemese de, yalnızca 'private' işleviyle ilgili şikayette bulunur. –
--QUOTE-- "Bu yeni işlevler verme çünkü' kamuoyunu genellikle daha iyi hata iletileri neden olacaktır, silinenler ile 'private'-ve-olmayan tanımlı üye işlevlerini yerine eski kodu revize akılda bu rulman değer. " –
Zorunlu. Ver. Moar. Yukarı. Oy. – kevinarpe
şu halinde
// Header file
class IAbstract
{
virtual void AbstractMethod() = 0;
public:
virtual ~IAbstract();
};
IAbstract* CreateSubClassA();
IAbstract* CreateSubClassB();
// Source file
class SubClassA : public IAbstract
{
void AbstractMethod() {}
};
class SubClassB : public IAbstract
{
void AbstractMethod() {}
};
IAbstract* CreateSubClassA()
{
return new SubClassA;
}
IAbstract* CreateSubClassB()
{
return new SubClassB;
}
Veri üyesi olarak '_stack' gerektirdiğine inanmıyorum. 'NoStackBase' yapıcısı içinde basit bir yığın değişkeni olarak yapmalısınız. –
Ayrıca sanallaştırıcıyı sanal yapmak zorunda değilsiniz. Hiç kimse türetilmiş bir sınıfı bir NoStackBase üzerinden silebilir. –
- 1. Yığın ayırma başarısız ve yığın ayırma başarılı! Mümkün mü?
- 2. Yalnızca Apache'nin 000-varsayılanına izin vermek için
- 3. H2 etiketlerinden sonra linebreak önlemek mümkün mü?
- 4. Doxygen korumalı elemanların çıkmasını önlemek mümkün mü?
- 5. PostgreSQL'de alt dizelerle sipariş vermek mümkün mü?
- 6. Bir sınıfa bir dize ile örnek vermek mümkün mü?
- 7. Yalnızca nesnenin başvurusu ile nesneyi kaldırın nesne
- 8. Bir parametre seti tanımlamak ve referans vermek mümkün mü?
- 9. C# wpf programımın kullanıcının dokunmatik ekranı olup olmadığını bilmesine izin vermek mümkün mü?
- 10. OpenSSH'yi yalnızca belirli dizinlere yüklemeye izin vermek için kısıtlama
- 11. Firebase'de, belirli bir nesneye yalnızca PUSH işlemlerine izin vermek için izinler belirleyebilir miyim?
- 12. Model kutusunda yalnızca metin karakterlerine izin vermek için Doğrulama
- 13. iPhone/iPad yönlendirmesinin tarayıcıda değişmesini önlemek mümkün mü?
- 14. Maksimum java yığın boyutunu dinamik olarak değiştirmek mümkün mü?
- 15. Chroot hapishanelerinin hapishane dışındaki dizinleri (salt okunur) paylaşmasına izin vermek mümkün mü?
- 16. DLL işlevselliğini sınırlamak mümkün mü?
- 17. d3 Sankey - Düğümlerin yerleşimini etkilemek veya karar vermek mümkün mü?
- 18. Yeni Facebook Sayfası Eklentisini stillendirmek mümkün mü?
- 19. Scala'da "this" kelimesini implicit parametresi olarak vermek mümkün mü?
- 20. İlişkilendirilmiş bir nesnenin ne zaman yok edileceğini bilmek mümkün mü?
- 21. Bir web sayfasını python'daki bir görüntüye doğrudan vermek mümkün mü?
- 22. Href'i kullanarak doğrudan Google arama sonuçlarına link vermek mümkün mü?
- 23. Javascript'te anında uyarıya çoklu giriş kutusu vermek mümkün mü?
- 24. Yalnızca alfasayısal, virgül, kısa çizgi, alt çizgi ve noktalı virgül izin vermek için regex
- 25. C++ 'da stack-only değişkeni mümkün mü?
- 26. Yeni bir pencere açmak ve iframe içine gömmek mümkün mü?
- 27. Yeni çalışma sayfası oluşturmak ve dosyadan veri eklemek mümkün mü?
- 28. dynamoDb izin kapsamını yalnızca bazı önek içeren tabloya ayarlamak mümkün mü?
- 29. iPhone'da güzel animasyon ile, UINavigationBar temsilci "geri" izin vermek
- 30. intellij IDE'de (Android Studio) yığın bellek boyutunu göstermek mümkün mü?
ters: http://stackoverflow.com/questions/10985/how-to-prevent-an-object-being-created-on-the-heap – kevinarpe