SORU
7 Mart 2009, CUMARTESİ


Boost ile NULL işaretçi::shared_ptr?

Aşağıdaki eşdeğer.

std::vector<Foo*> vec;
vec.push_back(NULL);

boost::shared_ptr ile uğraşırken? Aşağıdaki kodu.

std::vector< boost::shared_ptr<Foo> > vec;
vec.push_back(boost::shared_ptr<Foo>());

Not: bu tür nesneleri çok geri itmek olabilir. nullPtr genel statik bir nesne bir yere ilan etmeli miyim? Bu şekilde sadece birinin yapılmış olması gerekir:

boost::shared_ptr<Foo> nullPtr;

CEVAP
7 Mart 2009, CUMARTESİ


Öneri (bağımsız değişken ile shared_ptr<T> kurucu çağırmak) doğru. (Değer 0 ile kurucu çağırmadan eşdeğerdir.) Sanmıyorum bunun olacağını daha yavaş daha arama vec.push_back() ile önceden varolan bir shared_ptr<T> beri inşaat ve gerekli her iki durumda da, (ya doğrudan ya da kopyasını inşaat-inşaat).

Ama eğer "güzel" kelimesi, aşağıdaki kodu deneyebilirsiniz:

class {
public:
    template<typename T>
    operator shared_ptr<T>() { return shared_ptr<T>(); }
} nullPtr;

Bu tek bir küresel nesne bildirir aşağıdaki doğal sözdizimi sağlayan nullPtr,:

shared_ptr<int> pi(new int(42));
shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly"));

...

pi = nullPtr;
psat = nullPtr;

Not kullanırsanız bu birden fazla çeviri birimi (kaynak dosyaları), ihtiyacınız olacak vermek, bir sınıf adı (örneğin _shared_null_ptr_type), hareket tanımı nullPtr nesneye ayrı .sınıfının tanımlandığı dosya cpp ve header dosyası extern bildirimleri ekleyin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dave Wallace

    Dave Wallace

    27 Kasım 2007
  • mahalodotcom

    mahalodotcom

    8 HAZİRAN 2007
  • tseyina

    tseyina

    2 AĞUSTOS 2006