перегрузка >> в с ++ - PullRequest
       6

перегрузка >> в с ++

0 голосов
/ 27 октября 2011

Я хочу перегрузить оператор >> в c ++, чтобы мой класс векторов мог принимать входные данные в виде [1 2 3 4 5].

Например:

class A
{
public:
    A()  {} 

    A(const std::vector<int>& source)
      : v_(source)  
    {

    }

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

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

int main (){
A my_vector;

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

}

Прямо сейчас я объявил функцию перегрузки для >> следующим образом:

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

}

Но я запутался в том, что мне нужно сделать дальше, чтобы сохранить то, что когда-либо было в моем буфере, для моего объекта A.Я предполагаю, что мне нужно проверить оба [] во входных данных, чтобы убедиться, что они приняты, иначе выйдите из приложения.Любые предложения

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Первое, что вам нужно, это передать второй аргумент по ссылке, чтобы объект, измененный внутри оператора, был тем же объектом, в который вы читаете.

Следующее, что вам нужно, это на самом деле считывать данные с вашего внутреннего вектора. Для этого вам нужно пропустить первый [, а затем читать цифры, пока не найдете ].

Первый символ может быть прочитан в символ, затем вы можете использовать copy, чтобы заполнить вектор, и, наконец, еще один читать в символ, чтобы прочитать ]:

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

Теперь это набросок, и вам нужно будет обработать ошибки, в частности, что произойдет, если первый символ не [ или последний символ не ] ...

Примечания:

Обычно не стоит предоставлять полный доступ к вашим внутренним данным, как вы делаете с помощью метода get_v(). То есть нет смысла делать v_ закрытым, если вы просто собираетесь предоставить полный доступ ... если он должен быть доступен, сделайте его общедоступным, и вы можете избежать написания двух функций доступа.

0 голосов
/ 27 октября 2011

Я не уверен, что правильно понимаю вопрос, но, похоже, вы пытаетесь поместить материал из std::cin в std::vector вашего объекта.Для этого вам нужен метод в вашем классе A, который помещает значения в вектор, например void A::push(int value), или вам нужно сделать свой вектор открытым, что не рекомендуется.в вашем перегруженном операторе вы вставляете числа в объект, используя vector.push.

...