#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
как avectoramp;
.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()
, и это все, что ему нужно в этом отношении.