2010-11-10 15 views
6

zaman kodu:yapıcı içinde 'bu' bir başvuru 'veren' tamam mı?

Scene::Scene(const std::string &scene_file) : ambient_light(0, 0, 0), background(0, 0, 0){ 
    scene_parser parser(*this); 
    parser.parse(scene_file); 
} 

scene_parser Sahne bir arkadaşı, ve ayrıştırma yöntemi (r/a) Sahne üyeleri erişir. Bu herhangi bir soruna yol açacak mı?

+0

kadar uzun 'this' yapıcı bünyesinden işaretçi değil, başlatma liste vermek olarak Tamam bir yerde unutulmamalıdır. –

+0

ayrıca C++ faq-lite'nin ne söylediğini kontrol et: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.7 – stefaanv

cevap

4

Özel örneğinizde sorun çıkmamalıdır.

Genellikle, this referanslarını vermekle ilgili sorun, iki nesnenin ömürlerinin tam olarak hizalanmadığı ve diğer nesnenin, daha önce imha edildikten sonra, atıfta bulunulan nesneye erişmeye çalıştığıdır.

Örneğinizde, scene_parser nesnesi yığının üzerindedir, bu nedenle Scene yapıcısının sonunda ömür sona ermektedir. Sağladığınız bir nesneye, sağladığınız this referansı üzerinden erişmeye çalışmanın hiçbir yolu yoktur, bu nedenle sorun çıkmayabilir.

+3

Hayır, ama 'ayrıştırıcı' sanal işlevler çağırırsa, istenen etkiyi elde edemezsiniz. Bu * yasal olsa da, (ve muhtemelen) bir hata olduğunu düşünebilirsiniz. –

+0

Bu, herhangi bir işaretçi vermeden, kuruculara veya "bu" işaretçisine özel hiçbir şey vermeyecek bir potansiyel. Kurucudan 'bunu 'vermekten vazgeçilen gerçek, kurucu, doğaçlama kurmayı bitirmeden önce sınıf üyesi işlevlerinin çağrılabilmesidir. –

+1

Sahne alt sınıflama üzerinde niyetim yok, bu yüzden her şey yolunda gibi görünüyor. – Bwmat

8

Evet, this numaralı başvuru kaynağına başvuruyoruz. Ancak, genellikle diğer nesne işaretçiyi daha sonra kullanacaksa bunu yapmak istersiniz. Kullanım durumunuz, çok kaygan bir eğim olan kurucu tamamlanmadan önce Scene'u kullanacak gibi görünüyor.

Şu anda, parse numaralı telefonu arayarak herhangi bir değişmez oluşturmuyorsunuz, bu yüzden tamam olmalı, ancak kırılmaya neden olacak değişiklikler de kırılgan ve kolaydır.

+0

İyi cevap. Bence diğer cevaplara yorumlarda verdiğiniz bazı bilgileri eklemelisiniz, çünkü ele alınması gereken bazı incelikler var gibi görünüyor. –

+2

@voodooclock: Sanal fonksiyonlara ilişkin uyarılar aslında başka bir nesneye 'this' işaretçi teslim gerektirmez. Sınıfın kendi işlevlerini yapıcının içinden çağırırken sorun yaşayabilirsiniz. Ayrıca, OP zaten 'Sahne' bir terminal sınıfı olduğunu, bu yüzden nesnenin dinamik tip bir sorun olmayacağını belirtti. –

+0

Ah, açıklık için teşekkürler - Ben bunu çok fazla okuyordum. –

1

Bu, bağlıdır.

Kurucu gövdesinin içinde (yani, başlatıcı listesi yürütüldüğünde), nesne geçerli türüne kadar "tam olarak oluşturulmuş" olarak kabul edilir. Bu nedenle, numaralı referansı *this olabilir, ancak herhangi bir virtual işlev çağrısı türetilmiş sınıflardaki geçersiz kılınmış işlevleri kullanmaz.

+2

Sanırım bunu sanal işlevlere yapılan çağrılarda geri aldınız, ancak bunun farkında olmanız gereken önemli bir şey. –

+0

@Ben: Haklısınız, "türetilmiş" yerine "taban" yazdım. –

0

Tüm alt nesneleriniz (üyeler ve tabanlar) yapıcının gövdesindeki ilk ifadeyle oluşturulur. Eğer nesneniz "geçerli durum" içinde (bu sizin sınıfınızın tanımının bir parçası olan, bazen "sınıf değişmezi" olarak adlandırılır) bu noktada tamamen yapılandırılmış bir nesne olarak ele alabilir ve onunla herhangi bir şey yapabilirsiniz. Bununla birlikte, sanal arama beklediğinizden veya gerektirdiğinden biraz daha farklı çalışır: eğer bu bir temel sınıfsa (ve böylece bu nesne başka bir şeyin alt nesnesi ise), son tür henüz "atanmamış" değildir. Örneğin, bu, salt sanal yöntemleri çağırmanın ve bir çalışma zamanı hatası almanın (bu yöntemlerin yine de tanımları yoksa) bir yoludur.

Daha ilginç bir durum, kurucu başlatıcıda bu kullanıyor; Bu bazı uyarılar var, ama bu aynı zamanda kurucu vücuttan önce.

İlgili konular