Класс двумерной точки как шаблон в си
Перейти к содержимому

Класс двумерной точки как шаблон в си

Шаблоны

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

Шаблон класса (class template) позволяет задать тип для объектов, используемых в классе. Но прежде чем перейти к определению шаблона класса, рассмотрим проблему, с которой мы можем столкнуться и которую позволяют решить шаблоны.

Допустим, нам надо описать класс банковского счета. Банковский счет должен иметь номер, однако на момент написания класса может быть неизвестно, какой тип будет представлять номер счета — это может быть числовой номер 1233545, а может и быть просто набор символов в виде строки, например, «1234878rtyio». На первый взгляд, мы можем просто определить два класса:

Хотя данный пример работает, но по сути мы получаем два идентичных класса, которые отличаются только типом id. Шаблоны класса позволяют уменьшить повторяемость кода, задав для класса универсальный тип. Изменим код, применив шаблоны:

Для применения шаблонов перед классом указывается ключевое слово template , после которого идут угловые скобки. В угловых скобках после слова typename идет параметр шаблона. Можно определить несколько параметров шаблона, в примере выше применяется только один параметр.

Параметр шаблона представляет произвольный идентификатор, в качестве которого, как правило, применяюся заглавные буквы, например, T. Но это необязательно. То есть в данном случае параметр T будет представлять некоторый тип, который становится известным во время компиляции. Это может быть и тип int, и double, и string, и любой другой тип. И теперь идентификатор счета будет представлять тип, который передается через параметр T.

Используем этот класс:

При использовании шаблона класса необходимо в угловых скобках после названия класса указать конкретный тип, который будет применяться вместо параметра T. Так, в первом случае вместо T применяется тип string , поэтому в конструктор класса можно передать строку:

Во втором случае применяется тип int, поэтому в конструктор передается число:

Также можно применять сразу несколько параметров. Например, необходимо определить класс банковского перевода:

Класс Transaction использует два параметра типа T и V. Параметр T определяет тип для счетов, которые участвуют вв процессе перевода. Здесь в качестве номеров счетов можно использовать и числовые и строковые значения и значения других типов. А параметр V задает тип для кода операции — опять же это может быть любой тип.

При использовании шаблона в этом случае надо указать два типа:

Типы передаются параметрам по позиции. Так, тип string будет использоваться вместо параметра T, а тип int — вместо параметра V.

Многомерные статические массивы

В си, наряду с одномерными, существуют и многомерные массивы. Например, двумерный массив: его можно представлять как массив массивов, или как матрицу. Размерность массива может быть и больше: трёхмерные, четырёхмерные и т.д.
Синтаксис остаётся прежним, добавляется только новая размерность

Например, двумерный массив

Доступ до элементов массива осуществляется также, как и в одномерном массиве

Особенностью является то, что по своему строению многомерный массив является обыкновенным, «одномерным», массивом. Все элементы расположены друг за другом. Доступ до элемента a[i][j] – по существу сдвиг на i*число столбцов + j. В двумерном массиве, таким образом, элементы расположены «по рядам», в трёхмерном — «по слоям», внутри которых элементы расположены «по рядам» и т.д.
В связи с этим, при начальной инициализации опускать размерность можно только в первых квадратных скобках:

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

Можно опустить первую размерность

Можно с помощью фигурных скобок сделать данные более удобными для чтения

Также, как и в одномерных массивах, если заявлено данных больше, чем указано при инициализации, то оставшиеся заполняются нулями. Например, единичная матрица 3 на 3

Из того, что многомерный массив является одномерным по структуре, вытекают некоторые интересные свойства. Например, доступ до элемента может быть осуществлён через его порядковый номер
a[i][j] === a[0][i*число столбцов + j] и т.д.

Примеры

1. Отсортируем двумерный массив методом пузырька. Для сортировки обычно используется два подхода — превращение двумерного массива в одномерный, сортировка, обратно превращение одномерного в двумерный, либо запутанное обращение к элементам через индекс. Можно сделать всё проще: работать с многомерным массивом как с одномерным

Замечание: по стандарту явно такое поведение не определено, но косвенно должно поддерживаться.

2. Даны координаты x и y точки, полученные в ходе фотосъёмки. Известно, сколько кадров в секунду делала камера. Вычислить скорость в каждый момент времени и среднюю скорость за всё время.

3. Массив используется как карта, где число 2 означает начало, а 3 — конец пути. Программа сначала находит координаты этих точек, после этого вычисляет расстояние Манхеттена (сколько нужно пройти по x и y от начала до конца) и расстояние по Евклиду (как гипотенузу прямоугольного треугольника).

4. Пользователь вводит 10 слов. Вывести слово с максимальной длиной. Программа внешне совершенно простая, единственная проблема — считывание и вывод слова. Так как слова храняться в двумерном массиве, то указатель на words[i][0] — это начало нового слова. Также не забываем об ограничении на длину при вводе.

email

Всё ещё не понятно? – пиши вопросы на ящик

Класс двумерной точки как шаблон в си

Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет

Не могу понять что не так.

Код
//Massive.h
#pragma once

template <class T> class Massiv
<
public:
int nx,ny,nz;
T** ar;
Massiv(int nx_,int ny_);

Код
//Massive.h
#include "Massiv.h"

Код
#include "Massiv.h"
int main() <
Massiv<double> MyMassiv(5,7);
>
Цитата
Ошибка 1 error LNK2001: неразрешенный внешний символ ""public: __thiscall Massiv<double>::
!
bsa
Для выделения сообщений компилятора используй тег QUOTE (цитата)!

Это сообщение отредактировал(а) bsa — 3.5.2011, 22:23

Профиль
Группа: Участник
Сообщений: 25
Регистрация: 30.9.2010

Репутация: нет
Всего: нет

Интерфейс и реализация шаблонного класса должны находиться в одном файле.

Код
T[i]=new T[ny];

Т в данном случае — это шаблонный тип, а не переменная.

Это сообщение отредактировал(а) JЕT — 2.5.2011, 21:36

Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211

Определение шаблонного класса пишется в заголовочном файле.

Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет

Вроде сделал вот так.
Как можно чтоб в режиме отладки можно было просматривать значения?

Код
template <class T> class Massiv
<
public:
int nx,ny,nz;
T** ar;
Massiv(int nx_,int ny_);

Это сообщение отредактировал(а) Mormishka — 3.5.2011, 20:03

Профиль
Группа: Участник
Сообщений: 25
Регистрация: 30.9.2010

Репутация: нет
Всего: нет

Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »

[ Время генерации скрипта: 0.1182 ] [ Использовано запросов: 21 ] [ GZIP включён ]

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *