2012-11-10 19 views
10

Bir C++ sınıfı işlevinin bir takma adını yazmanın basit bir yolu olup olmadığını merak ediyordum. Bazı list konteyner nesne varsa Örneğin, mantıksal fonksiyonC++ sınıf işlev takma adları

int list::length() { return len; } 

olurdu Ama programcılar kullanabileceği başka mantıksal takma yerine tam hem fonksiyonlarını yazma, Yani

int list::size() { return len; } 

olabilir vücut, list::size()list::length() bir takma yapmak için herhangi bir yolu var, böylece derlenmiş, ancak aynı işlevi başvuruyor bir çoğaltma değil mi?

Bunu, #define ile yapabileceğinizi okudum, ancak tamamen kapsam dışı bir yerde (yani 'boyut' değişkeni) başka kod adları ile herhangi bir karışıklığa neden olmak istemiyorum.
Ayrıca, işlev işaretleyicilerinin bunu düzeltebildiğini de okudum, ancak bu tam olarak bir takma ad değildir (ayrıştırma işlemini uygulamak zorunda olduğu için), ne de işaretçiye bir bildirim verilebilir, bu da ona kafa karıştırıcı bir yardım hattı verir. Kullanıcılar (Ben düşünürdüm), artı başka bir nesne içinde kodumu iç içe gerekiyorsa karışıklık (kapsamı ayarlamak zorundayım). Herhangi sıkı 'takma adıyla' sözdizimi c yoktur,

inline int list::length() { return len; } 
    inline int list::size() { return length(); } 

Ya ++: my tahminlerin

biri aşağıdakiler en optimize derleyici tarafından doğrudan işlev takma adı olarak alınacaktır edilir? (Bulamadım - emin değildim)
Peki, bunu yapmanın en etkili yolu ne olurdu?

DÜZENLEME: Soruyu sadece bir merakım olduğu için bu sorunun cevabını almak için kabul ettim. İyi bilgiye sahip herkes, lütfen yorum veya cevap ekleyin, ve hatta cevabımı bile değiştirebilirim.

+0

C++ ile Aliasing, genellikle işaretçiler gibi çalışan ve dereferencing gereksinimini ekleyen başvurular tarafından yapılır. – imreal

+1

Bitiş kodunuz, her iki işlev için de doğruysa, herhangi bir modern derleyici tarafından aynı montajı üretmelidir. – chris

+0

İyi soru. Varsayılan ve silinmiş işlevlere izin vererek, C++ 11'de bir adım atıldığını düşünüyorum. Eğer int foo() = delete' tamam ise, neden int foo() = int foo_default() 'tam olarak sunmanızın nedenleri için uygun olamaz? Belki de bir sonraki standartta :) Bildiğim kadarıyla şu anda vücuttaki diğer func'lara açıkça başvurmaktan daha iyi bir yol yoktur. – SomeWittyUsername

cevap

4

Bunu yapmak için önişlemci ve #define kullanmazdım. Genel olarak ön işlemcinin C++ 'da son çare olması gerekir. Önişlemcinin makrolarını kullanmanın çeşitli kötülükleri hakkında bir bölüm içeren bu C++ FAQ on inline functions'a bakın.

Ben aşağıdaki gibi bir şey yapacağını daha karmaşık bir işlev ve arayüzü ile birkaç farklı adlar olacak bir işleve sahip olacaktır kullanacağı yaklaşım:

int list::length(string xString, int iValue) { 
    int iReturnValue = 0; // init the return value 
    // do stuff with xString and iValue and other things 
    return iReturnValue; 
} 

Ardından aşağıdaki gibi bir şey yapmak bir takma ad.

inline int list::size(string xString, int iValue) {return length(xString, iValue);} 

Satır içi temelde asıl işlevi gerçek işlev çağrısı ile değiştirmelidir.

Ayrıca bkz. stack overflow posting Giving a function implementation more than one name. Bunu yapmak istememenizin bazı nedenleri vardır.

+0

Yani, sanırım bu konuyla ilgili sorum şu ki, satır içi işlevler hala argümanları diziyor; bu bir çift istifleme yapar mı? yani "list :: size" işlevi için yığın parametreleri ve daha sonra iç dosya listesi :: length' işlev çağrısı için _another_ param kümesini toplayın, çünkü derleyici 'list :: size' argümanlarını yeniden kullanmak isteyebilir. onları tekrar göndermekten başka? veya derleyiciler bunu yakalar ve sadece bir yığın uygularlar mı? Gerçekten modern sistemlerde bir optimizasyon olmadığını biliyorum ama sadece merak ettim .. – Codesmith

+0

@AUTO, Burada satır içi fonksiyonlar hakkında bir SSS (http://www.parashift.com/c++-faq/inline-functions. html). Bir satır içi fonksiyonun fikri, derleyicinin işleve bir çağrı üretmemesidir, daha ziyade fonksiyonun kaynak metnini alır ve fonksiyon çağrısını fonksiyonun üretilen nesne koduyla değiştirerek inline derler. Bu yüzden kod bloğuna yol açabilir. –

İlgili konular