2010-10-18 18 views

cevap

3

Cevap, yukarıda chryspi isteğinize göre. Diğer yanıtlarda da belirtildiği gibi, referansları kendi başlarına bulunmayan referanslar olarak kullanamazsınız.

için başvuruları kullanabilir, ancak, ama boost::reference_wrapper<T> yardımcı sınıfı kullanılarak:

typedef boost::reference_wrapper<int> intref; 
    std::vector<intref> v; 
    int i; 
    i = 9; 

    v.push_back (boost::ref (i)); // store &i 

    int& j = v[0]; 
    j = 10; 
    //v[0].get() = 10; 

    std::cout << i << std::endl; // prints 10 

doğrudan elemanı v[0] düzenlemeyle bir örnek olarak koyun. Gerçek bir başvuru yerine bir boost::reference_wrapper<T> aldığınız için biraz zor olduğundan (get() yöntemini çağırmanız gerekir) dikkat edin.

belleğe göre güvenle işaretçileri depolamak için, benzer şekilde boost::shared_ptr kullanabilirsiniz.

9

STL kapları varsayılan kurucu ile nesneleri inşa edebilmek gerekir. Bunu bir referansla yapamazsın. Bir referansın geçerli olduğu garanti edilir, bu nedenle her zaman atama ile başlatılmalıdır.

Onun yerine bir işaretçi kullanmak gerekir.

+5

başka nedeni vardır için yeniden adlandırmak gerekir. Referanslar atanamaz. İnanıyorum ki :: std :: vector', içinde saklanan şeyin atanabilir olmasını gerektirir. – Omnifarious

+3

İki not burada. Bir de referansları kapsayıcılarda saklamak için "destek" i kullanabilirsiniz. Ve işaretçiler hakkında, ayrıca güvenli bir şekilde saklamak için boost :: shared_ptr'. bellek ayırma. –

+2

Atanabilirlik muhtemelen buradaki suçludur. AFAIK, kapsayıcılar, onu kullanan yöntemleri çağırmazsanız (örneğin, varsayılan ve benzerleriyle yeniden boyutlandır() '), varsayılan kurucu gerektirmez. – visitor

3

, dahili olarak, bir vector<T>T nesnelerin bir sırası depolamak için bir dizi kullanır. Kaynaklar nesne olmadığı için, referans dizisi diye bir şey yoktur (standartta 8.3.2 §5'e bakınız), dolayısıyla referans türleri vector şablonunu parametrelemek için kullanılamaz.

Muhtemelen istediğiniz, std::vector<boost::shared_ptr<T> > gibi akıllı işaretçiler veya boost::ptr_vector<T> gibi özel bir işaretçi kabı vektörüdür.

İlgili konular