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

Bijvoorbeeld:

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

}

Maar ik ben in de war over wat ik moet doen om vervolgens wat ik in mijn film heb met mijn A-object op te slaan. Ik neem aan dat ik beide [] in de invoer moet controleren om zeker te zijn dat het wordt geaccepteerd, anders verlaat ik de applicatie. Suggesties

0
@ildjarn: Ik denk van wel. Dus in plaats van Een vector zou je A & vector hebben.
toegevoegd de auteur Zeenobit, de bron
@Jon: Bedoel je vector als een A & ?
toegevoegd de auteur ildjarn, de bron
Waar heb je het verklaard? En hoe?
toegevoegd de auteur FailedDev, de bron
U wilt ook A als een vector & nemen.
toegevoegd de auteur Jon, de bron
@ildjarn: Errr ... ja. vector == parameternaam && A == klassenaam is nogal verwarrend :)
toegevoegd de auteur Jon, de bron
Waarom heb je de [] nodig? Ze zijn nutteloos voor u omdat u alleen 1 , 2 , 3 , 4 , 5 .
toegevoegd de auteur wkl, de bron
@birryree Ik dacht dat het een goede oefening zou zijn en zou het leesbaarder maken. Zelfs als ik veel doe met [], laat dat nog steeds de vraag hoe ik de input kan nemen.
toegevoegd de auteur cody, de bron

2 antwoord

Het eerste dat u nodig hebt, is het doorgeven van het tweede argument door verwijzing, zodat het object dat in de operator is gewijzigd, hetzelfde object is waar u in leest.

Het volgende dat je nodig hebt is om daadwerkelijk vanuit de invoer in je interne vector te lezen. Daarvoor moet u de eerste [ overslaan en de cijfers lezen totdat u de ] vindt.

Het eerste teken kan in een teken worden gelezen, vervolgens kunt u kopiëren gebruiken om de vector in te vullen en ten slotte moet een ander in een teken lezen om de ] te lezen:

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

Dit is een schets en u zult fouten moeten afhandelen, met name wat er gebeurt als het eerste teken niet [ is of het laatste teken is ] ...

Kant aantekeningen:

Het is meestal geen goed idee om volledige toegang tot uw interne gegevens te bieden, zoals u doet met de methode get_v() . Dat wil zeggen, het heeft geen zin om v _ privé te maken als u alleen volledige toegang wilt geven ... als het toegankelijk moet zijn maak het openbaar en u kunt voorkomen dat u de twee accessor-functies moet schrijven .

3
toegevoegd

Ik weet niet zeker of ik de vraag peroperatief begrijp, maar het lijkt erop dat u dingen uit std :: cin in de std :: vector van uw object probeert te plaatsen. Hiervoor heeft u een methode nodig in uw klasse A die waarden in de vector plaatst, zoals void A :: push (int value) , of u zou hebben om uw vector openbaar te maken, wat niet raadzaam is.

In uw overbelaste operator voegt u vervolgens de getallen in uw object in met behulp van vector.push .

0
toegevoegd
Een andere optie is om de functie vriend te gebruiken. Zijn klasse heeft vector & get_v() , en dat is alles wat hij in dit verband nodig heeft.
toegevoegd de auteur Mooing Duck, de bron