2015-10-29 26 views
8

A Sınıfı bir nesneyi (geniş anlamıyla, örneğin A & veya A * tarafından) başka bir Sınıf B'nin yapıcısına atıfta bulunmak istiyorum. B içinde değiştirilecek 'a' istemiyorum ('a' sadece okunabilir ve bu yüzden büyük bir boyuttadır, bu yüzden referans olarak iletmek istiyorum). Ben iki seçenekten biliyorum:C++ 'da başvuru seçenekleriyle geçme

1) Geçiş 'a' olarak

const A & a_ 

2) Geçiş 'a'

const A * a_ 

seçenek 1 dezavantajı Yanlışlıkla bir geçebilir olmasıdır

olarak r değeri. Seçenek 2'nin dezavantajı, boş bir işaretçiyi yanlışlıkla iletebileceğim.

Sorularım: 1) Yukarıdaki dezavantajlar konusunda haklı mıyım? 2) Referans ile 'a' aktarmanın başka bir yolu var mı?

Aşağıdaki linkten cevapları gördüm. Ama bu soruda yayınlanandan başka seçenekler varsa merak ediyorum. http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/reference_wrapper

O, yani yapıcı aşırı yük çözünürlüğü buna bir rvalue geçmeye çalışması durumunda, bu yüzden rvalue referansı alır ekstra silinmiş yapıcı kazanır ve elde edersiniz: Are there benefits of passing by pointer over passing by reference in C++?

+5

o yanlışlıkla bir r-değeri geçecek ve ne kadar ciddi olduğunu hamlenin sonuçlarının olacağı nasıl muhtemeldir? – emlai

+1

Endişeleriniz varsa ve sorunları biliyorsanız, hata kontrolüne ihtiyacınız var. Referans olarak geçin ve deneyin/yakalayın. Bir işaretçi tarafından yaparsanız, nesnenizin orijinal örneğini değiştirirsiniz. –

+1

Bir ritim nedir? Tanımlanmamış bir eşitlik mi? Bir değer gibi mi? –

cevap

18

const A & numarasından geçiş.

Bu işlevin = delete işlevinin aşırı yüklenmesini bildirerek kazara ritmik geçişleri önleyebilirsiniz. Örneğin:

struct A { }; 

void func(const A & a) { } 
void func(A && a) = delete; 

int main() 
{ 
    A a; 
    func(a); // compiles 
    func(A()); // doesn't compile 
} 
+1

Şunlarla uğraşırken karşılaştığım zor bir konu var: Eğer gerçekten * tüm * rıhtımları devre dışı bırakmak istiyorsanız, 'void func (const A &&) = delete;' yerine kullanmak daha iyidir. Garip ve kirli görünüyor, ama iş yapıyor.Bunun nedeni, aksi takdirde 'const' değeri ile döndürülen eski kodun (önerilmez, ancak ne yazık ki sık sık fabrika benzeri işlevlerde kullanılmaz) yerine func (const &); İlgili: http://stackoverflow.com/q/33244951/3093378 – vsoftco

4

std::reference_wrapper 'ler yapıcıları bir göz atın bir hata.

Aynı şeyi yapabilirsiniz: hem const A& hem de A&& yapıcılarını bildirin ve ikincisini silin. O zaman kimse bir rengin içinde geçemez.

-3

kodu:

#include <iostream> 
using namespace std; 

struct A 
{ }; 

int func_one(A& var) { 
    A * insertVal=new A; 
    if (&var==nullptr) 
     return 0; 
    else 
     return 1; 
} 

int main() { 
    A refVar; 
    int x; 
    x=func_one(refVar); 

    return 1; 
} 
+2

Bu, derleme değil. – emlai

+0

Neden? Yapı yok mu? –

+2

Derlemeyi deneyin, aldığınız hataları görün ve önce bunları düzeltin. Geçersiz kod içeren bir kod yanıtı çok yardımcı olmuyor. – emlai