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.