![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Zhunko |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.11.2009 Репутация: нет Всего: нет |
В идеале два первых вывода должны быть одинаковы. Но в случае наличия конструктора копирования работает неправильно. После вызова конструктора копирования оператор & не вызывается. Компилятор считает, что передаю класс А, а не число типа int. В std::vector это каким-то образом сделано. Разбирался так и не понял. Там так всё просто, что зацепиться не за что. Что надо сделать, чтобы конструктор копирования работал и оператор & после него вызывался? Это сообщение отредактировал(а) Zhunko - 30.11.2012, 02:20 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Ты объявил пустой коструктор копирования, который ничего не делает. естественно не работает.
Если коструктор копирования не объявлен, компилятор сделает его за тебя. В данном случае сгенирированый компилятором конструктор будет правильным, и всё будет работать правильно. |
|||
|
||||
| Zhunko |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.11.2009 Репутация: нет Всего: нет |
Это для простоты восприятия таким показал конструктор копирования.
У меня в основном коде, откуда сделал упрощённый пример, такой:
Это тоже не работает. Тогда, какой должен быть конструктор копирования? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| Zhunko |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.11.2009 Репутация: нет Всего: нет |
Вызывается в случае отсутствия явного коструктора копирования. В остальных случаях игнорируется. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Прямой вывод => ваш конструктор копирования неверен. и это без вариантов. как правильно сказал math64,
В программе всегда есть конструктор копирования, либо ваш, либо дефолтный. С вашим не работает, с дефолтным работает ==> ... что из этого следует ? Хотя в коде дофига и другой путаницы. например, непонятно зачем оператор [] возвращает сам объект. но это уже второстепенно. Добавлено через 7 минут и 27 секунд вот, написал простеньки конст.коп. http://codepad.org/gd6BJTpF что не работает ? |
|||
|
||||
| Zhunko |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.11.2009 Репутация: нет Всего: нет |
Спасибо! Ваш код работает. Нашёл чего не хватало у меня. Не все члены класса инициализировались. Как раз те, что отвечали за индекс, не добавил. Init() один раз написал и забыл.
На счёт возврата оператором [], спасибо! Глаз замылился. Написал класс-оболочку над std::vector для работы с ним, как с многомерным динамическим массивом. Можно менять количество измерений на ходу без нарушения структуры данных. Есть возможность передавать указатель или ссылку на начало массива. Т.е. данные непрерывны. Тесты все прошёл, а, как попытался в качестве аргумента функции с шаблонным типом передать содержимое ячейки - ошибка. Это сообщение отредактировал(а) Zhunko - 30.11.2012, 18:40 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
буст переписывашь ? http://www.boost.org/doc/libs/1_52_0/libs/...y/doc/user.html -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Zhunko |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.11.2009 Репутация: нет Всего: нет |
Буст смотрел. У меня круче и интерфейс проще.
Не вышло. Сначала правильно сделал. Это, если один оператор [] и он возвращает содержимое ячейки, то всё красиво выходит. Если много [], то не компилируется. Ему же требуется класс-объект, а не содержимое ячейки. Сейчас всё работает. Спасибо всем! Особенно volatile! Но последний вопрос остаётся. Посмотрел в дебаггере. Всё же:
a[0] функция получает, как класс A, а не число-значение (123) указанного типа int. Это потом срабатывает перегрузка
и всё работает. Как сделать так, чтобы компилятор сразу воспринимал аргумент, с типом содержимого ячейки массива? Это сообщение отредактировал(а) Zhunko - 30.11.2012, 20:10 |
||||||
|
|||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Вы вообще о чем? Вы серьезно считаете что здесь собрались исключительно экстрасенсы-телепаты ? Вы возвращаете из оператора [] ссылку на А, компилятор и воспринимает ее как ссылку на А. По моему, весьма логично. И что-то другое требовать от компилятора, как-то даже странно... Охотно верю, но по коду что вы привели, этого, мягко говоря, пока не скажешь. |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Zhunko, буст конечно отстой по сравнению с вашим классом, но я о другом хотел спросить: приведите плиз пример задачи, для решения которой нужен ваш класс, т.е. для чего нужен многомерный массив с изменяемыми размерностями?
|
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Zhunko, и сформулируйте вопрос внятно, с кодом в котором можно понять проблему.
Не полагаясь на то, что все абсолютно в курсе всех подробностей того что вы там делаете. и тогда вы возможно получите ответ. у bsa есть хорошая фраза в подписи
|
|||
|
||||
| Zhunko |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.11.2009 Репутация: нет Всего: нет |
Да уж, яснее некуда объяснил. Имел ввиду несколько операторов [] подряд для такого обращения к многомерному массиву:
Здесь компилятор требует к оператору [] массив или указатель. Так, что вернуть содержимое ячейки не получится для нескольких []. Ну нельзя, значит нельзя. Не настаиваю.
Где код привёл? Про отстой, заметьте, не я сказал Есть такой язык MQL4. Там данные можно объединить только в массивы. Память, которой можно пользоваться, только недавно сделали 4 Гб. До этого было всего 2 Гб. Данные, которые требуется обрабатывать, составляют десятки Гб. На данный момент программный комплекс у меня обрабатывает максимум 5-мерный массив. Приходится по-всякому экономить. Хорошо, что ещё DLL разрешили подключать, а то совсем плохо было бы. В перспективе надо выводить расчёты за пределы MQL4. Тогда таких ограничений не будет. Но это непросто сейчас. Пока работает и так. Есть более важные задачи. Кстати, реализация, как у буста, у меня тоже есть. Такой же параметр шаблона для объявления количества измерений. Только этот параметр у меня инициализирован по умолчанию и ограничивает максимальное количество измерений. Т.е. можно работать с ним, как с жёстко заданным количеством измерений, так и с изменяемым.
Нет проблемы. Нечего формулировать. Всё работает. Спасибо! Это сообщение отредактировал(а) Zhunko - 3.12.2012, 03:51 |
||||||||
|
|||||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
В этой строчке, получается, у вас объект в правой стороне выражения изменяется 3 раза? Поверьте, такой side-effect, мало кто, готов ожидать. Zhunko, я конечно не знаю что вы там пишите, но имхо, интутивно чувствую что вы делаете что-то не то. например
я уж не говорю про то, что он вообще в принципе никогда не может быть rvalue. В общем, проблем на свою голову вы найдете... |
|||
|
||||
| Zhunko |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.11.2009 Репутация: нет Всего: нет |
4 раза будет меняться.
К сожалению, такая арифметика для класса не доступна. Пока не знаю, как это сделать. Правильнее сказать, знаю, как сделать некрасиво. Например, перегрузить [] с парой типов аргумента. Завершающий оператор вызывать с конкретным типом. Лучше не буду так делать, чем иметь возможность складывать содержимое ячеек с индексацией в []. Хотя, в этом что-то есть. Таким образом, можно частично на компилятор возложить слежение за правильностью применения []. Отслеживание количества [] сам класс делает. Зато есть метод At(), с которым такая арифметика работает:
Это сообщение отредактировал(а) Zhunko - 1.12.2012, 21:52 |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |