2011-12-17 15 views
6

Bu koda sahibim, ama pratik bir örnek değil.Ref türünde bir sınıf üyesine sahip olmanın amacı nedir?

Ex.

class Animal 
{ 
    int i; 
    int& ref; 
    public: 
    Animal() : ref(i) 
    { 
    } 
}; 

Herkes daha iyi anlayabilmem için bir sınıf üyesi olarak ref gerektiğinde gerçek bir yaşam örneği sunabilir mi?

+1

@pst: Bu tamamen alakasız. C++ referansları yeniden toparlanamaz, bu yüzden örnek alınabilir referanslardan örnek vermek hiçbir şey eklemez. –

+0

@BenVoigt * Tamamen * alakasız (yarattığım türlerin çoğunun mutasyondan kaçınması/"salt okunur" üyeler olması). Yine de çok geçerli bir noktanız var. –

+0

@ user966379, bence sizden "Aynı sınıftaki başka bir üyeye atıfta bulunan bir ref türü olan bir sınıf üyesine sahip olmanın amacı nedir?" Sorusunu yeniden belirtmeniz gerektiğini düşünüyorum. Bu, gelecekte web arama yapanlara yardımcı olacaktır. –

cevap

3

bazı sınıf A çok sayıda nesnenin hepsi aynı ya da başka bir sınıfı, tek bir paylaşımlı örneğine bakınız gereken herhangi bir zamanda; Bu temelde bir const pointer aynıdır

class Person { 
    private: 
     Person &mother_; 
     Person &father_; 

    public: 
     Person(Person &mother, Person &father) : mother_(mother), father_(father) {} 
     // ... 
} 
+3

OP'nin yararı için, bu nesne yönelimli programlamada yaygın olarak kullanılan birleştirme olarak adlandırılır. –

+0

@ChrisParton Bu "toplama" düşünmezdim. Bir OO bağlamında "kümelenme" hakkında düşündüğümde, onu, kalıtım kullanmayan bir tür uzantı biçimi olarak kullanmayı düşünüyorum. "toplama" nesnesine yönelik yöntemler, iç/özel nesnelere ("kümelenmiş") dönüştürülür. Bu durumda, sadece * yeni nesneler oluşturma değil, aynı "paylaşılan" nesnelere atıfta bulunma meselesidir. (Bir Kişi bir anne Kişiyi ya da bir babayı “genişletmez”.) –

+1

Bu, bir işaretçi yerine bir * referansı * neden kullanacağınızı açıklamamaktadır, çünkü referanslar geri tepme ve işaretçiler olamaz. Bir referans kullanarak, bir kopya kurucusuna sahip olmanız gerekir. –

1

Emin: şablon sınıfının std::reference_wrapper<T> tüm amacı bir başvuru tutmaktır!

Bunun birçok kullanım alanı vardır. Örneğin, onu (her zaman kopyalar yapan) std::thread yapıcısına iletebilirsiniz. Ayrıca, referans sarmalayıcıların kaplarını da yapabilirsiniz. Bir çıkış akışı sarmak istediğinizde

şey bir başvuru Holding da yararlı olabilir; Orijinal akışı bir referans olarak tutuyorsunuz ve ona bir şeyler ekliyorsunuz (örneğin, this answer of mine, sarıcı nesnelere temel akışa bir başvuru ekleyerek geliştirilebilir).

+0

Std :: reference_wrapper C++ 11 midir? Havent tüm standardı henüz okudu –

1

: örneğin birkaç People hepsi aynı anne ve/veya babası olabilir. Başka bir nesneye boş olmayan bir işaretçiye ihtiyacınız varsa ve bu işaretçi yalnızca yapım sırasında atanırsa, bunun yerine bir başvuru kaynağı kullanmayı seçebilirsiniz.

İlgili konular