2010-01-20 16 views
18

Qstring'i bir fonksiyona parametre olarak göndermenin en verimli ve pratik yolunun, QT'de daha spesifik olarak ne olduğunu bilmek isterim. Bir referans kullanmak istiyorum. Sorun ben de böyle fonksiyonu kendisinde o dizeyi örneğini istiyorum bu yüzden örneğin: şimdiQStrings'i bir işlev çağrısında yollamanın en iyi yolu nedir?

myFunction(tr("Hello StringWorld")); 

:

void myFunction(QString & theMsg); 

bu fonksiyon çağrısıdır:

bu fonksiyon prototipidir function tr() bir QString döndürür, ancak bir başvuruyla çalışmaz (nedenini görebilirim).

ben bunu yapmak zorunda:

QString theQstr("Hello StringWorld"); 
myFunction(theQstr); 

başvuruları kullanarak hala bu süre yapmak için basit bir yolu var mı yoksa sadece bir QString kullanmak fonksiyon parametresini değiştirebilir ve hala verimli olacaktır?

+0

Bu konu hakkında: myFunction (QString ("Hello StringWorld")); – Jamol

+0

Bu bir derleme mesajı oluşturdu. Bence bunun nedeni sadece referans olarak somut bir şey olmaksızın geri dönüş değeri yaratmasıdır. –

+0

Bu bağlantı size yardımcı olabilir: [Right_way_to_pass_QString_to_methods] (http://developer.nokia.com/community/wiki/Right_way_to_pass_QString_to_methods) – ABCplus

cevap

14

QString perde arkasında COW (Write On kopyala) kullanır, bu yüzden böyle bir imza kullanmak eğer gerçek bir dize bile kopyalanmaz:

geçersiz myFunction (QString theMsg)

(bunu değiştirene kadar).

Eğer kesinlikle bir başvuru istiyorsanız giriş argümanını değiştirmeyi planlamıyorsanız, const & kullanırdım.

void myFunction (QString const & theMsg)

+0

Hayır thats great, thx! Bu bilmek istediğim şey. Yani aslında bir Mac üzerinde Objective-C'de NSString ile aynı şeyi yapar. –

+13

Qt kaynak koduna bakarsanız, Qt'nin Qt türlerinin const T & to fonksiyonları olarak geçme eğiliminde olduğunu görürsünüz. COW kullanıyor olsalar da, bir referansı geçmekten ziyade bir sınıfı kopyalamak için hala biraz daha fazla yük vardır. – Colin

+0

@Colin O ek yükü detaylandırır mısınız? Sadece kaynağa baktım ve bir QString sadece bir işaretçi etrafında bir sarıcı. Ben emin olmak için 'QString' ve bir const QString & 'emin olmak için, ve her ikisi de 4 bayt. Bir QString temelde bir işaretçi olduğundan (ve refs etkili bir şekilde işaretçilerdir), işaretçiyi kendisinin geçmesi yerine bir işaretçiyi bir işaretçiye iletmek neden daha verimli olur? Const-ref biraz daha az verimli olurdu gibi geliyor ... – weberc2

7

en etkili ve pratik bir şekilde bir sabit başvuru kullanıyor. QString COW referanstan daha yavaş ancak normal bir kopyadan daha hızlı olacaktır.

+1

Neden? [Yorumu geçerli yapmak için daha fazla karakter] – weberc2

İlgili konular