Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шаблон n мерного массива 
:(
    Опции темы
Mormishka
Дата 17.4.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хочу создать класс,
конструктор которого 
massiv(int n,template <T>)
к каждому элементу к которого можно обращаться вот так massiv[i1]...[in]
Как возможно сделать?
PM MAIL   Вверх
boostcoder
Дата 17.4.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



это?:
Код

#include <iostream>
#include <cassert>

template<typename T, size_t N>
struct massiv {
   T& operator[](size_t idx) {
      assert(idx <= N);
      return arr[idx];
   }
   const T& operator[](size_t idx) const {
      assert(idx <= N);
      return arr[idx];
   }
private:
   T arr[N];
};

int main() {
   massiv<char, 128> arr;
}

http://liveworkspace.org/code/ad6533a59a01...a6b2dfbc1ffdb4e
PM WWW   Вверх
Mormishka
Дата 17.4.2011, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



boostcoder, 
как я понял создается одномерный массив размера n. 
Я имел ввиду создать n-мерный массив. Не одномерный массив размера n, а массив 
 i1 x i2 x ... in-1 x in 

PM MAIL   Вверх
xvr
Дата 18.4.2011, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Mormishka @  17.4.2011,  15:35 Найти цитируемый пост)
Я имел ввиду создать n-мерный массив. Не одномерный массив размера n, а массив 
 i1 x i2 x ... in-1 x in 

Код

template<class T, const int N>
class massiv {
public:
 template<class T, const int N>
 class subarray {
 public:
   subarray<T,N-1> operator[] (size_t);
 };
 template<class T>
 class subarray<T,1> {
   T& operator[] (size_t);
 };

 subarray<T,N-1> operator[] (size_t);
};
Для N==1 понадобится отдельная специализация класса massiv (если N==1 нужно)


Это сообщение отредактировал(а) xvr - 18.4.2011, 12:04
PM MAIL   Вверх
Mormishka
Дата 19.4.2011, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



xvr, 
Как им пользоваться?
Это действительно многомерный массив ?
PM MAIL   Вверх
xvr
Дата 19.4.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Mormishka @  19.4.2011,  17:35 Найти цитируемый пост)
Это действительно многомерный массив ? 
Действительно, но реализацию вам придется написать самому  smile 
Оператор индексации класса massiv возвращает другой класс, у которого так же есть оператор индексации, который возвращает еще другой класс, и так далее, последний из них возвращает референс на элемент


Цитата(Mormishka @  19.4.2011,  17:35 Найти цитируемый пост)
Как им пользоваться?

Ну например - массив интов размерности 3:
Код

massiv<int,3> int3_array;

int val=int3_array[0][1][2];
int3_array[2][1][3]++;


PM MAIL   Вверх
bsa
Дата 19.4.2011, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Mormishka, обычно, такие вещи на практике не нужны. Подумай над задачей хорошенько, возможно, найдется более красивое и простое решение.
PM   Вверх
Mormishka
Дата 20.4.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



bsa, 

Ну хорошо, нужно одномерный, двумерный и трехмерный с шаблоном.

Еще такой вопрос. Я в вначале отказался от многомерных массивов т.к. на нелзя в отладке посмотреть, что в них. Это от чего зависит ?

Это сообщение отредактировал(а) Mormishka - 20.4.2011, 17:10
PM MAIL   Вверх
Mormishka
Дата 20.4.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Подскажите хоть как это сделать, хотя бы примерно?
PM MAIL   Вверх
bsa
Дата 20.4.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Mormishka, сделай остальные из трехмерного. Ну или из одномерного (массив массивов массивов), хотя, это уже предложили сделать через шаблоны.

Это сообщение отредактировал(а) bsa - 20.4.2011, 17:15
PM   Вверх
Mormishka
Дата 20.4.2011, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

massiv<int,3> int3_array;

int val=int3_array[0][1][2];
int3_array[2][1][3]++;



Код

Ошибка    1    error C2248: massiv<T,N>::subarray<T,1>::operator []: невозможно обратиться к private член, объявленному в классе "massiv<T,N>::subarray<T,1>"


Это сообщение отредактировал(а) Mormishka - 20.4.2011, 19:31
PM MAIL   Вверх
xvr
Дата 20.4.2011, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Напиши public: перед 11 строкой (я как то забыл)

PM MAIL   Вверх
bsa
Дата 20.4.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



добавь "public:" после 10-й строки.
PM   Вверх
Mormishka
Дата 20.4.2011, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



память то динамически выделяется? массив динамический? мне-то как раз это нужно.
PM MAIL   Вверх
bsa
Дата 20.4.2011, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(Mormishka @ 20.4.2011,  20:39)
память то динамически выделяется? массив динамический? мне-то как раз это нужно.

как сделаешь, так и будет. тебе дали заготовку, которую еще нужно доделать.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.