перагрузкі >> ў C ++

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].

Напрыклад:

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){

}

Але я зьбянтэжаны тым, што мне трэба рабіць далей, каб захаваць тое, што калі-небудзь у маіх Кінах да майго аб'екту. Я мяркую, мне трэба, каб праверыць, як [] на ўваходзе, каб пераканацца, што ён прыняты ў адваротным выпадку выйсці з прыкладання. любыя прапановы

0
@ildjarn: Я так думаю. Такім чынам, замест Вектар , вы б а і вектар .
дададзена аўтар Zeenobit, крыніца
@ Джон: Вы маеце на ўвазе вектар як а & ?
дададзена аўтар ildjarn, крыніца
Дзе ж вы аб'яўляеце яго? І як?
дададзена аўтар FailedDev, крыніца
Вы хочаце ўзяць А як вектар і а.
дададзена аўтар Jon, крыніца
@ildjarn: Errr ... так. <�Код> вектар == імя параметру && А == імя класа роду заблытаная :)
дададзена аўтар Jon, крыніца
Навошта вам патрэбен [] ? Яны бескарысныя для вас, як вы проста хочаце дадаць 1 , 2 , 3 , 4 , <�код > 5 .
дададзена аўтар wkl, крыніца
@birryree Я проста падумаў, што гэта будзе добрым практыкаваннем, і зробіць яго больш зручным для чытання. Нават калі я так з [], што па-ранейшаму пакідае пытанне аб тым, як я магу ўзяць на ўваход.
дададзена аўтар cody, крыніца

2 адказы

Першае, што вам трэба, каб прайсці другі аргумент па спасылцы, так што аб'ект змяняецца ўнутры аператара і той жа аб'ект, які вы чытаеце ст.

Наступнае, што вам трэба, гэта на самай справе чытаць ад уваходу ў свой унутраны вектар. Для гэтага Вам трэба прапусціць першы [, а затым чытаць лічбы да таго часу, пакуль не знойдзеце ] .

Першы знак можа быць прачытаны ў паўкокс, то вы можаце выкарыстоўваць капіяваць для запаўнення вэктару, і, нарэшце, іншыя прачытаў у паўкокс чытаць ] :

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;
}

Цяпер, гэта эскіз, і вам трэба будзе апрацоўваць памылкі, у прыватнасці, тое, што адбываецца, калі першы сімвал не [ або апошні сімвал не ] ...

Пабочныя нататкі:

Гэта, як правіла, не вельмі добрая ідэя, каб забяспечыць поўны доступ да унутраным дадзеных, як вы робіце з get_v() метад. Гэта значыць, няма сэнсу рабіць v _ прыватнымі, калі вы толькі збіраецеся, каб забяспечыць поўны доступ ... калі яна павінна быць даступныя абнародуюць яго, і вы можаце пазбегнуць таго, каб напісаць дзве функцыі аксессоров ,

3
дададзена

Я не ўпэўнены, я разумею, пытанне peroperly, але мне здаецца, што вы спрабуеце пакласці рэчы з станд :: CIN у вашым аб'екта станд :: вектар . Для гэтага вам патрэбен метад у А клас, які змяшчае значэння ў вектар, напрыклад, анулявання A :: штуршок (INT значэнне) , ці вы б каб зрабіць свой вектар грамадскасці, што не пажадана.

Тады ў вашым перагружанага аператара, вы б ўставіць лік у вас аб'ект, выкарыстоўваючы vector.push .

0
дададзена
Іншы варыянт быў бы сябар функцыі. Яго клас мае вектар і get_v() , які ўсё, што ён мае патрэбу ў гэтых адносінах.
дададзена аўтар Mooing Duck, крыніца