Ni55aN
@Ni55aN

Почему this NULL в istream_iterator?

При чтении из файла в вектор получаю ошибку Stack Overflow. Где и в каком месте и какой стек переполнен - не ясно, известно лишь то, что Pnt*, а именно указывает на имя this == NULL

class Pnt {
public:int a;
	   Pnt() { a = 77; };

	   Pnt(int s) {
		   a = s;
	   }

	   Pnt& operator=(const int a) {

		   this->a = a;
	   }
	 
};

std::ostream& operator<<(std::ostream& output, const Pnt& p)
{
	output << p.a;
	return output;
}

std::istream& operator>>(std::istream& s, const Pnt& p)
{
	s >> p.a;
	return s;
}

std::vector<Pnt> newVector;
std::ifstream ifs(filename, std::ios::in | std::ifstream::binary);
std::istream_iterator <Pnt> iter(ifs); // здесь необработанное исклчение
std::istream_iterator <Pnt> end;
std::copy(iter, end, std::back_inserter(newVector));


С s.putback(p.a); работает, но не ясно почему s << p.a не отрабатывает?

Операторы перегружены правильно. В чем тогда причина?
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Операторы перегружены правильно.

А вот и нет. Ваша ошибка
std::istream& operator>>(std::istream& s, Pnt& p)   // убрать const!

Не обязательно, но можно.
explicit Pnt(int s) {…} // добавить explicit!
Что получается? Мы пытаемся считать в неизменную p.a. Прямое s >> p.a; не подходит — поле-то неизменное. И тут, как ни странно, находится цепочка: создать временный Pnt и снова вызвать саму себя!

Добавить explicit: запрещаем вызывать этот конструктор неявно.
Убрать const: расфиксировать p.a.

Также у вас ошибка в перегрузке операции «присвоить».
Pnt& operator=(const int a) {
       this->a = a;
       return *this; // ну забыл!
     }


Насчёт explicit. Конструкторы с одним параметром вообще стоит делать explicit всегда, когда объект семантически отличен от параметра. Например, VeryLongInt(10) или Complex(10) — это та же десятка, и explicit можно опустить. А Vector(10) — динамический массив из 10 элементов ≠ десятке, тут explicit нужен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы