Професионална програма
Loading...
+ Нов въпрос
kostadink2001 avatar kostadink2001 7 Точки

08. C++ OOP Inheritance and Polymorphism - Task 3. TypedStream

Здравейте,

затруднявам се сериозно с трета задача от домашното заради '>>' оператора. Искам да попитам дали е възможно да оувъррайтнем оператора >> за std::istream ако приема темпейтен параметър и ако да, то как? Това е моята версия на readToEnd() функцията:

std::vector<T> readToEnd() {
		std::vector<T> res;
		T toRead;
		while (this->stream >> toRead) {
			res.push_back(toRead);
		}
		return res;
	}

'this->stream >> toRead' ми извежда грешка - "binary '>>': no operator found which takes a right-hand operand of type 'T' (or there is no acceptable conversion)", това предполагам означава, че трябва да оувъррайтна оператора, но когато се опитам да го направя по този начин като съм казал на класа, че това е friend ми казва - "operator '>>' is ambiguous".

template<typename T>
std::istream& operator>>(std::istream out, T& element) {
	return out >> element;
}

Нямам идея как да го овъррайтна за да бъде темплейтен. Благодаря предварително!

 

0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки
Best Answer

Здравей,

На прав път си, но не съвсем. Вярно е, че трябва да четеш от stream-а, но това ли е начинът, по който трябва да четеш?

Каква е работата на класовете IntStream, StringStream и VectorStream? Забележи, че те само едно единствено нещо дефинират. Те знаят как да го вършат това нещо правилно.

TypedStream е базовият клас, който се занимава с общите неща, но не знае конкретно как да прочете нещо от stream-а, защото не знае какво е нещото, което чете. В твоя случай грешката идва от VectorStream. Vector класа не дефинира operator>>, така че колкото и да се опитваш да го четеш от stream, или да предефинираш оператор, който го чете от stream, няма да проработи, защото никога няма да е дефинирано stream >> vector;

Също така няма как да знаеш дали някой няма да добави още някой клас - няма как да дефинираш operator>> за всеки възможен клас, който може да се чете с TypedStream.

Затова обаче ги има наследяващите класове. Те знаят как да прочетат нещо от съответния тип и преизползват базовите операции в TypedStream, за да не трябва да се пише това четене елемент по елемент във всеки клас, а да го има само веднъж на мястото, където ти си го написал.

Тоест, не трябва да се мъчиш да четеш от stream-а. Целта ти е да ползваш виртуалния operator>> - наследяващите класове ще го override-нат за да имплементират четенето правилно.

И най-добре го ползвай с this->operator>>(read) синтаксиса, така е по-ясно че искаш да ползваш последния override, не текущия вариант в базовия клас.

Поздрави,

Жоро

0