C++. Шаблоны. Шаблоны как методы классов.

Всегда необходимо полностью указывать любое имя, объявленное в базовом классе, который каким-либо образом зависит от параметра шаблона. Для этого можно использовать конструкции this-> или Base::.
Чтобы гарантированно исключить какую бы то ни было неопределенность, можно использовать полное имя при любом обращении к членам классов (в шаблонах).
===========================================
Упражнение обязательное для понимания этой темы.
Создание класса. В private поле этого класса одну переменную. В public поле этого класса — конструктор, геттер. Нужно перегрузить оператор =. Т.е. внутри класса всего 4 поля.

Вот такой вод вид у класса. Во внутренние поля ничего добавлять не надо. Только применить этот псевдовариант в коде и заставить его заработать. Методы описывать можно как внутри класса, так и вне. Я, как автор сайта, начинал именно с такого вот момента. Если Вы прекрасно ориентируетесь в перегрузке операторов, то, не обязательно выполнять. Но если нет, то без малейшего понимания перегрузки операторов, а в данном случае оператора присваивания, вся это тема будет хуже вообще незнакомого языка.
В результате правильной работы должно получится приблизительно так:

==========================================

Итак. Эта тема про то, как использовать присваивание в объектах разных классов. (речь идет о таких объектах, в которые имеет смысл присваивать объекты других классов). В большинстве случаев это объекты абсолютно эквивалентных классов, которые отличаются, только внутренними типами.

Вот приблизительно такие классы. Этот пример не компилируется, он просто схема и нужен для того, чтобы весь набор листингов в сумме не испортил материал.

Коли кто-то это читает, то он должен быть знаком с шаблонами более или менее. Иначе придется все-таки начать со знакомства. А это не в этой теме. Так как таких классов может быть много, то много писать — много времени на написание, исправление, корректировки, поэтому используются шаблоны.

Если присваивать обычные данные встроенных типов, то проблемы с компиляцией не возникает. Неявно или с помощью явного приведения все корректно компилируется и запускается. А вот здесь, с классами, такой фокус не проходит. Требуется перегрузка оператора присваивания.

Вот рабочий код с таким присваиванием

Тут имело смысл сделать проверку на присваивание самому себе и надо эту проверку делать, чтобы избежать издержек копирования. Я этого не сделал, просто для того, чтобы внимание было уделено наиболее важным местам. Такой код работает, но если инстанировать шаблон другого типа, то этот прием с присваиванием уже дает сбой. Нужно еще допиливать этот код.

Дело в том, что используемый по умолчанию оператор присвоения требует одинаковости типов с обеих своих сторон, а здесь слева double (тип Num3), а справа int (тип Num1). Если бы это были обычные встроенные типы, то не было бы больших проблем, а так как у нас классы, то вот возникают. Не умеет компилятор так глубоко копать, будьте любезны и научите его.

Это решается простым указанием того, что в правой стороне оператора присваивания будет свой тип.(некоторые константы уберу, но константность — вещь крайне важная). Просто, чтобы читалось полегче убираю, оставляя частично.

Проверка на присваивание самому себе нужна, чтобы избежать ненужного копирования в больших объектах. (стеки, очереди..). В этом примере такое копирование не столь затратно. Следует быть особо внимательным к указанием типов. И не стоит забывать, что это НЕ идеальный, но учебный пример, который можно и нужно допилить. Это всего-лишь ознакомление, начало знакомства.

На самом деле это не так сложно, как может казаться на первый взгляд. Для восприятия темы очень важно научиться понимать перегрузку оператора =, шаблонные функции и шаблонные классы. От этих трех тем, тут только прием прописки шаблонной функции внутри шаблонного класса.

22-23 строчки последнего листинга читаются как: "Внутри шаблона с параметром T определяется внутренний шаблон с параметром Т2 "

Еще стоит отметить такой момент, что

Оператор присвоения шаблона не замещает оператор присвоения, используемый по умолчанию. Для присвоения объектов одного и того же типа по-прежнему будет вызываться стандартный оператор присвоения.

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

В автобусе молодой паренек обращается к девушке: - Девушка, Вы случайно не программистка? - Да. А как Вы догадались? - Да, у Вас такое глупое выражение лица! - Дурак! - Да, я тоже программист.

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок