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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.