2010-12-06 24 views
7

Derse üye olunduğunda bir arkadaşınıza ne oluyor?Bir üye fonksiyonu fonksiyona bağlanma

Aşağıdaki kod derleniyor ve çalışıyor. Arkadaş beyanı olmadan 'operatör için çok fazla argüman' üretilir (ve haklı olarak). Bunu yapmanın hiçbir anlam ifade etmediğini, ancak bana burada neler olduğunu anlatabildiğini anlıyorum. Arkadaşım derleyiciyi bu parametreyi bir şekilde ihmal etmek için zorluyor mu?

bir sınıfın üyesi işlevini kendisi ile arkadaş olmak ne olur
class Test 
{ 
public: 
    friend bool operator<(Test& lhs, Test& rhs) 
    { 
    return true; 
    } 
}; 

int main(int c, char** argv) 
{ 
    Test test1; 
    Test test2; 

    return test1 < test2; 
} 
+1

Sorunuzu cevaplamak için: Arkadaşlar C++ 03'teki arkadaşlık sınıfının üyesi olamaz, ancak C++ 0x'de buna izin verilir. –

+0

Merak ediyorum, üye fonksiyonunun tamamen erişime sahip olduğu için arkadaşının kendisi olmasına izin vermek için mümkün olan nokta ne olabilir? – radman

+0

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#77 adresine veya geçmişe bakın (özellikle bu durum çok da önemli değildir, çünkü iç içe geçmiş sınıflar C++ 0x ve çoğu C++ 03 derleyicilerinde yuvalama sınıfı. –

cevap

9

fark arkadaş tüm tanımını sınıfı içinde görünse bile üye olmadığıdır; daha ziyade, işlev çevredeki ad alanına yerleştirilir. Yani, this işaretçisi yok. Bir üye operator<, dolaylı olarak ve açık sağ taraftaki bağımsız değişken üzerinde çalışırken, friend, işlev parametreleri olarak açıkça sağlanmış hem sol hem de sağ taraf argümanına ihtiyaç duyar - bu nedenle fazladan parametre. friend sürümünüz, sınıftan sonra, private ve protected üyelerine ve tabanlarına erişimi olan ve örtülü olarak inline (ancak derleyicinin satır içi olması gerektiği anlamına gelmez) işlevini yerine getirmekle eşdeğerdir, yalnızca bir ipucu, ancak friend işlevinizin birçok çeviri biriminden alınabilmesi ve sorun yaşamadan bağlantı oluşturması gibi Tek Tanımlama Kuralı açısından önemlidir.

1

!?

Bu hiç mantıklı değil. Bir sınıfın üye işlevi işlevi, aynı sınıfın arkadaşı olabilir mi?

operator <'u bir arkadaş işlevi olarak (bir üye işlevi olarak değil) aşırı yüklediniz. Sınıf içinde bir arkadaş fonksiyonunun tanımı (bedeni) sağlanması yasaldır. Ancak onun tanımının içinde this kullanmak yasa dışıdır

friend bool operator<(Test& lhs, Test& rhs) 
{ 
    *this ; //error 
    return true; 
}