2010-10-27 32 views
5

Haydi bir char dizisi içeren bir sınıf yapıyorum diyelim. Şimdi, operatör bu işler: EnAktarıcı operatörü hakkında soru <<

myClass inst; 
cout << inst; 

"cout < < inst;" Sadece sınıfın adıyla ne denir? Teşekkürler. std::ostream &operator<<(std::ostream &, myClass const &)std::ostream &operator<<(std::ostream &, myClass const &).

+6

<< operatör? – Shog9

+0

Zor olan: D. Beni oraya aldın: -D. Haha. Teşekkür ederim. Bu yüzden asıl sorum, her zamanki gibi aptalcadır, çünkü evrensel bir "geri dönüş değeri" ye gerek yoktur, ikili vardiya operatörü vb. Dahil her operatörle tanımlayabilirsiniz. Doğru mu aldım? –

+0

Mükemmel adam, teşekkürler. –

cevap

12

std::ostream &operator<<(std::ostream &, myClass const &). İsterseniz bunu aşırı yükleyebilirsiniz.

2

Derleyici, operator<<'un aşırı yüklenmesini arayacaktır.

std::ostream &operator<< (std::ostream &os, const myClass &x); 

Bu a yapmanız gerekebilir: Özellikle, aşağıdaki prototip ile aşırı gerektiğini, std::ostream üyesi fonksiyonlu aşırı yük (geçmez) veya ücretsiz fonksiyonu ya arayacaktır Korumalı/özel üyelere erişmeniz gerekiyorsa, arkadaşın myClass.

2

Bu, ostreamin bildiği türden bir aşırı yüklenme yazıcısı operatörünüz olmadıkça, derleyici hatasıyla sonuçlanır. Kendi türünüzü, genel ostream& operator(ostream& os, const myClass& x)'u aşırı yükleyerek veya türünüzü bir dizge/int'ye dönüştürerek bildiği türlere ekleyebilirsiniz. Dikkatli olun, typecast aşırı yükleme sizi ayağınıza vurabilir ve kötü bir uygulama olarak kabul edilir.

basit yolu sadece sınıfından bazı değişkenleri yazdırıyor:

myClass inst; 
cout << inst.getName() << ": " << inst.getSomeValue(); 
1

std::cout << someClass kullanabilmek için için aşağıdaki gibi bir operatör oluşturmak zorunda:

std::ostream &operator<< (std::ostream &, const someClass &); 
4

bir arkadaş oluşturarak Aşağıdaki örnekte olduğu gibi çıkış operatörü.

#include <iostream> 

class MyClass { 
    friend std::ostream & operator<<(std::ostream &out, const MyClass &inst); 
public: 
    // ... public interface ... 
private: 
    char array[SOME_FIXED_SIZE]; 
}; 

std::ostream & operator<<(std::ostream &out, const MyClass &inst) 
{ 
    out.write(inst.array, SOME_FIXED_SIZE); 
    return out; 
} 

değil bu karakter dizisi sonlandırıldı (0 karakter) aslında nul olup olmadığını "karakter dizisi" ile ne demek hakkında bazı varsayımlar, büyük ölçüde basitleştirilmiştir yapar edin.

Güncelleme: Bunun kesinlikle sınıf için bir dönüş değeri değil, tanımlamakta özgür olduğunuz sınıfın bir metinsel sunumu olduğunu söyleyeceğim.

+0

Arkadaşlık işlevi olmak zorunda değil, ama sonra sınıfına başka bir genel işlev yöntemi eklemelisiniz; –

+0

Nesneyi yazdırmak için gereken tüm bilgilerin kamu işlevlerinde kullanılabilir olması olabilir. Operatör <<() 'nin sınıfa dış olması gerekir (çünkü ilk argüman sınıf tipinde değildir). Tüm bilgileri genel sınıf arabiriminden alırsa, bir 'arkadaş' olabilir. Yazdırma işlemini gerçekleştirmek için üye işlevini çağırabilir ve bazen bu iyi bir fikirdir. –

+0

@VJo + @David - evet Genel arayüzden tüm bilgileri toplayabiliyorsanız, bir arkadaş fonksiyonu olmanıza gerek olmadığını kesinlikle kabul ediyorum. –