Mümkünse üye olmayan ve arkadaş olmayan işlevler olarak.
Herb Sutter ve Scott Meyers tarafından açıklandığı gibi, kapsüllemeyi artırmaya yardımcı olmak için arkadaş olmayan üye olmayan işlevleri üye işlevlere tercih edin.
C ++ akışları gibi bazı durumlarda, seçeneğiniz olmaz ve üye olmayan işlevleri kullanmanız gerekir.
Ancak yine de, bu işlevleri sınıflarınızın arkadaşları yapmanız gerektiği anlamına gelmez: Bu işlevler, sınıf erişimcileriniz aracılığıyla sınıfınıza yine de erişebilir. Bu fonksiyonları bu şekilde yazmayı başarırsanız, o zaman kazanırsınız.
Operatör << ve >> prototipleri hakkında
Sorunuzda verdiğiniz örneklerin yanlış olduğuna inanıyorum. Örneğin;
ostream & operator<<(ostream &os) {
return os << paragraph;
}
Bu yöntemin bir akışta nasıl çalışacağını düşünmeye bile başlayamıyorum.
İşte << ve >> operatörlerini uygulamanın iki yolu.
T türünde akış benzeri bir nesne kullanmak istediğinizi varsayalım.
Ve Paragraf türündeki nesnenizin ilgili verilerini T'den / içine çıkarmak / eklemek istediğinizi.
Genel operatör << ve >> işlev prototipleri
Birincisi işlev olarak:
// T << Paragraph
T & operator << (T & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// T >> Paragraph
T & operator >> (T & p_oInputStream, const Paragraph & p_oParagraph)
{
// do the extraction of p_oParagraph
return p_oInputStream ;
}
Genel operatör << ve >> yöntem prototipleri
İkincisi, yöntem olarak:
// T << Paragraph
T & T::operator << (const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return *this ;
}
// T >> Paragraph
T & T::operator >> (const Paragraph & p_oParagraph)
{
// do the extraction of p_oParagraph
return *this ;
}
Bu gösterimi kullanmak için T'nin sınıf bildirimini genişletmeniz gerektiğini unutmayın. STL nesneleri için bu mümkün değildir (onları değiştirmeniz gerekmez ...).
Peki ya T bir C ++ akışı ise?
C ++ akışları için aynı << ve >> operatörlerinin prototipleri aşağıda verilmiştir.
Genel basic_istream ve basic_ostream için
C ++ akışını değiştiremeyeceğiniz için, akışlar söz konusu olduğunda, işlevleri uygulamanız gerektiğini unutmayın. Bunun anlamı şunun gibi:
// OUTPUT << Paragraph
template <typename charT, typename traits>
std::basic_ostream<charT,traits> & operator << (std::basic_ostream<charT,traits> & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// INPUT >> Paragraph
template <typename charT, typename traits>
std::basic_istream<charT,traits> & operator >> (std::basic_istream<charT,traits> & p_oInputStream, const CMyObject & p_oParagraph)
{
// do the extract of p_oParagraph
return p_oInputStream ;
}
Char istream ve ostream için
Aşağıdaki kod yalnızca karakter tabanlı akışlar için çalışacaktır.
// OUTPUT << A
std::ostream & operator << (std::ostream & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// INPUT >> A
std::istream & operator >> (std::istream & p_oInputStream, const Paragraph & p_oParagraph)
{
// do the extract of p_oParagraph
return p_oInputStream ;
}
Rhys Ulerich, karakter tabanlı kodun üstündeki genel kodun bir "uzmanlığı" olduğu gerçeği hakkında yorum yaptı. Tabii ki, Rhys haklı: Char temelli örneğin kullanılmasını önermiyorum. Sadece okuması daha kolay olduğu için burada verilmiştir. Yalnızca char tabanlı akışlarla çalışıyorsanız uygulanabilir olduğundan, wchar_t kodunun yaygın olduğu platformlarda (yani Windows'ta) bundan kaçınmalısınız.
Umarım bu yardımcı olur.