C ++ da juda yuklangan

I want to overload the >> operator in C++ so that my class of vectors can take input in the form [1 2 3 4 5].

Misol uchun:

class A
{
public:
    A()  {} 

    A(const std::vector& source)
      : v_(source)  
    {

    }

   //returns an immutable reference to v_
    const std::vector& get_v() const
    {
       return v_;
    }

   //returns a mutable reference to v_
    std::vector& get_v()
    {
        return v_;
    }
private:
    std::vector v_;
};

int main (){
A my_vector;

while (cin >> my_vector)
  //do some other computations

}

Right now I've declared the overloading function for >> like this:

istream& operator>> (istream & stream, A vector){

}

Lekin mening ob'ektimga nima kirganini saqlash uchun nima qilishim kerakligi haqida shubhalanaman. Boshqacha qilib aytganda, dasturdan chiqishni qabul qilish uchun [] ni tekshirish kerak. Har qanday taklif

0
@ildjarn: Men shunday deb o'ylayman. Shuning uchun A vector o'rniga A & vector bo'lasiz.
qo'shib qo'ydi muallif Zeenobit, manba
@Jon: vektor kodini A & deb ataysizmi?
qo'shib qo'ydi muallif ildjarn, manba
Qaerda e'lon qildingiz? Va qanday?
qo'shib qo'ydi muallif FailedDev, manba
Siz A ni vector & sifatida qabul qilishni xohlaysiz.
qo'shib qo'ydi muallif Jon, manba
@ildjarn: Errr ... ha. vector == parametr nomi va && A == sinf nomi shubhali narsadir :)
qo'shib qo'ydi muallif Jon, manba
Nima uchun [] kerak? 1 , 2 , 3 , 4 , 5 .
qo'shib qo'ydi muallif wkl, manba
@birryree Men yaxshi mashqlar deb o'yladim va uni o'qiy olishim mumkin edi. Hatto [] bilan yo'l tutsam ham, men bu ma'lumotlarni qanday kiritishim mumkinligi haqidagi savolni qoldiradi.
qo'shib qo'ydi muallif cody, manba

2 javoblar

Sizga kerak bo'lgan birinchi narsa, ikkinchi argumentni operator orqali o'zgartiriladigan ob'ekt, siz o'qiyotgan narsaning aynan shu ob'ektga aylanishidir.

Sizga kerak bo'lgan keyingi narsa - bu sizning ichki vektoringizga kiritilgan ma'lumotlarni o'qishdir. Buning uchun [] birinchi va ] topguningcha raqamlarni o'qib chiqishingiz kerak.

Birinchi belgini charda o'qishingiz mumkin, keyin vektorni to'ldirish uchun nusxa dan foydalanishingiz mumkin va nihoyat, ] ni o'qish uchun chiziqqa o'qiladi:

std::istream& operator>>( std::istream & stream, A & vector ) {
    char ch;
    stream >> ch; 
    std::copy( std::istream_iterator(stream), std::istream_iterator(),
               std::back_inserter( vector.get_v() ) );
    stream.clear();
    stream >> ch;
    return stream;
}

Endi bu eskizdir va siz xatolar bilan ishlashingiz kerak, ayniqsa, birinchi belgi [ yoki oxirgi belgilar ] bo'lmasa nima sodir bo'ladi ...

Yon belgilari:

get_v() usuli bilan siz o'zingizning ichki ma'lumotingizga to'liq kirishni ta'minlash yaxshi holdir. Ya'ni, agar to'liq kirishni ta'minlasangiz, v_ ni xususiylashtirishda hech qanday nuqta yo'q ... agar u erkin bo'lishi kerak bo'lsa, uni ommaviy qiling va ikkita kirish moslamasini yozishdan qoching .

3
qo'shib qo'ydi

Savolni bir-biriga tushunishimga ishonchim komil emas, lekin siz std :: cin dan narsangizni std :: vector -ga qo'shishga harakat qilyapsiz. Buni amalga oshirish uchun siz a void A: push (int value) kabi vektorga qiymat qo'yadigan usul kerak yoki Sizning vektoringizni ochiq qilishni tavsiya eting, bu tavsiya qilinmaydi.

Keyin, ortiqcha yuklangan operatoringizda raqamlarni vector.push dan foydalanib ob'ektga kiritasiz.

0
qo'shib qo'ydi
Boshqa variant esa friend funksiyasidir. Uning sinfida vector & get_v() mavjud.
qo'shib qo'ydi muallif Mooing Duck, manba