перегрузка >> в c

#c #overloading #inputstream

#c #перегрузка #входной поток

Вопрос:

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

Например:

 class A
{
public:
    A()  {} 

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

    }

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

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

int main (){
A my_vector;

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

}
  

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

 istreamamp; operator>> (istream amp; stream, A vector){

}
  

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

Комментарии:

1. Вы также захотите использовать A как a vectoramp; .

2. Зачем вам это нужно [] ? Они бесполезны для вас, так как вы просто хотите добавить 1 , 2 , 3 , 4 , 5 .

3. Где вы это объявили? И как?

4. @Jon: Ты имеешь в виду vector как Aamp; ?

5. @birryree Я просто подумал, что это было бы хорошим упражнением и сделало бы его более читаемым. Даже если я делаю way с помощью [] , это все равно оставляет вопрос о том, как я могу принимать входные данные.

Ответ №1:

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

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

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

 std::istreamamp; operator>>( std::istream amp; stream, A amp; 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_ private, если вы просто собираетесь предоставить полный доступ… если он должен быть доступен, сделайте его общедоступным, и вы сможете избежать необходимости писать две функции доступа.

Ответ №2:

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

Затем в вашем перегруженном операторе вы должны вставить числа в свой объект, используя vector.push .

Комментарии:

1. Другим вариантом может быть friend функция. У его класса есть vectoramp; get_v() , и это все, что ему нужно в этом отношении.