Cout'u nasıl kullanabilirim << sınıfım


82

myclass benim tarafımdan yazılmış bir C ++ sınıfıdır ve yazdığımda:

myclass x;
cout << x;

Nasıl çıktı alabilirim 10veya 20.2bir integerveya bir floatdeğer gibi?

Yanıtlar:


100

Tipik olarak operator<<sınıfınız için aşırı yükleme yaparak:

struct myclass { 
    int i;
};

std::ostream &operator<<(std::ostream &os, myclass const &m) { 
    return os << m.i;
}

int main() { 
    myclass x(10);

    std::cout << x;
    return 0;
}

9
myclassHerhangi bir privatealan varsa ve operator<<()bunların çıktısını almak istiyorsanız , arkadaş olarak myclassbildirmeniz gerektiğini unutmayın std::ostream& operator<<(std::ostream&, myclass const&).
Justin Time - Monica'yı eski haline

3
Bunun const myclass &myerine olması gerekmez myclass const &mmi?
Nubcake

3
@Nubcake: Hayır. Derleyicinin umurunda olduğu sürece, ikisi aynı anlama geliyor, ancak yine de önek formunun yanlış olduğunu düşünüyorum. Bir C ++ bildiriyi okumak için, beyan edilen yaradığını başlatın ve birlikte, dışa yol çalışması consttürden sonra, diyor: m is a reference to a const myclass. Yazının önündeyken, "m, anlamsız ve gerçekten dramatik olmayan arasındaki düzensiz kenarda yer alan" sınıfım bir cisme atıftır "diyor.
Jerry Coffin,

1
Benim kadar kafası karışmış herkes için, operatörü aşırı yüklemeyi sınıf tanımınızın dışına koyun (tıpkı örnekteki gibi).
umnikos

1
@Lorenzo: Hayır, üye işlevi olamaz. Daha fazla ayrıntı için stackoverflow.com/a/9814453/179910 adresine bakın.
Jerry Coffin

22

<<Operatörü aşırı yüklemeniz gerekiyor ,

std::ostream& operator<<(std::ostream& os, const myclass& obj)
{
      os << obj.somevalue;
      return os;
}

Sonra bunu yaptığınızda cout << x( sizin durumunuzdaki xtürden myclass), yöntemde söylediğiniz her şeyi çıkarır. Yukarıdaki örnek durumunda x.somevalueüye olacaktır.

Üyenin türü doğrudan bir üyeye eklenemiyorsa , yukarıdaki ile aynı yöntemi kullanarak bu tür ostreamiçin <<operatörü de aşırı yüklemeniz gerekir .


4
Bu, "akış operatörü" değil, sol kaydırma operatörüdür. Iostreams bağlamında, bu ya ekleme ya da çıkarma operatörüdür, ancak asla akış operatörü değildir.
Billy ONeal

1
Üzgünüm, evet haklısın. Bunu sadece akışlarla uğraşırken kullanmaya eğilimli olduğum için kafamda böyle adlandırdım. Bu durumda, sadece akış operatörü yerine, dediğiniz gibi ekleme operatörü olacaktır. Cevabımı bu kısmı kaldırmak için güncelledim.
Rich Adams

14

çok kolay, sadece uygulayın:

std::ostream & operator<<(std::ostream & os, const myclass & foo)
{
   os << foo.var;
   return os;
}

Çıkışı zincirlemek için işletim sistemine bir referans döndürmeniz gerekir (cout << foo << 42 << endl)


-3

Alternatif:

struct myclass { 
    int i;
    inline operator int() const 
    {
        return i; 
    }
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.