| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Конструктора копирования |
| Автор: Zhunko 30.11.2012, 02:18 | ||
В идеале два первых вывода должны быть одинаковы. Но в случае наличия конструктора копирования работает неправильно. После вызова конструктора копирования оператор & не вызывается. Компилятор считает, что передаю класс А, а не число типа int. В std::vector это каким-то образом сделано. Разбирался так и не понял. Там так всё просто, что зацепиться не за что. Что надо сделать, чтобы конструктор копирования работал и оператор & после него вызывался? |
| Автор: math64 30.11.2012, 07:44 |
| Ты объявил пустой коструктор копирования, который ничего не делает. естественно не работает. Если коструктор копирования не объявлен, компилятор сделает его за тебя. В данном случае сгенирированый компилятором конструктор будет правильным, и всё будет работать правильно. |
| Автор: Zhunko 30.11.2012, 11:56 | ||
| Это для простоты восприятия таким показал конструктор копирования. У меня в основном коде, откуда сделал упрощённый пример, такой:
Это тоже не работает. Тогда, какой должен быть конструктор копирования? |
| Автор: xvr 30.11.2012, 12:01 |
У вас нет оператора &, а есть у вас оператор приведения типа к int& (и он скорее всего вызывается) |
| Автор: Zhunko 30.11.2012, 12:24 | ||
Вызывается в случае отсутствия явного коструктора копирования. В остальных случаях игнорируется. |
| Автор: Zhunko 30.11.2012, 18:04 | ||
Спасибо! Ваш код работает. Нашёл чего не хватало у меня. Не все члены класса инициализировались. Как раз те, что отвечали за индекс, не добавил. Init() один раз написал и забыл.
На счёт возврата оператором [], спасибо! Глаз замылился. Написал класс-оболочку над std::vector для работы с ним, как с многомерным динамическим массивом. Можно менять количество измерений на ходу без нарушения структуры данных. Есть возможность передавать указатель или ссылку на начало массива. Т.е. данные непрерывны. Тесты все прошёл, а, как попытался в качестве аргумента функции с шаблонным типом передать содержимое ячейки - ошибка. |
| Автор: borisbn 30.11.2012, 18:50 | ||
буст переписывашь ? http://www.boost.org/doc/libs/1_52_0/libs/multi_array/doc/user.html |
| Автор: Zhunko 30.11.2012, 19:21 | ||||||
Буст смотрел. У меня круче и интерфейс проще.
Не вышло. Сначала правильно сделал. Это, если один оператор [] и он возвращает содержимое ячейки, то всё красиво выходит. Если много [], то не компилируется. Ему же требуется класс-объект, а не содержимое ячейки. Сейчас всё работает. Спасибо всем! Особенно volatile! Но последний вопрос остаётся. Посмотрел в дебаггере. Всё же:
a[0] функция получает, как класс A, а не число-значение (123) указанного типа int. Это потом срабатывает перегрузка
и всё работает. Как сделать так, чтобы компилятор сразу воспринимал аргумент, с типом содержимого ячейки массива? |
| Автор: volatile 1.12.2012, 00:27 | ||||
Вы вообще о чем? Вы серьезно считаете что здесь собрались исключительно экстрасенсы-телепаты ?
Вы возвращаете из оператора [] ссылку на А, компилятор и воспринимает ее как ссылку на А. По моему, весьма логично. И что-то другое требовать от компилятора, как-то даже странно... Охотно верю, но по коду что вы привели, этого, мягко говоря, пока не скажешь. |
| Автор: baldina 1.12.2012, 00:39 |
| Zhunko, буст конечно отстой по сравнению с вашим классом, но я о другом хотел спросить: приведите плиз пример задачи, для решения которой нужен ваш класс, т.е. для чего нужен многомерный массив с изменяемыми размерностями? |
| Автор: volatile 1.12.2012, 00:54 | ||
| Zhunko, и сформулируйте вопрос внятно, с кодом в котором можно понять проблему. Не полагаясь на то, что все абсолютно в курсе всех подробностей того что вы там делаете. и тогда вы возможно получите ответ. у bsa есть хорошая фраза в подписи
|
| Автор: Zhunko 1.12.2012, 04:30 | ||||||||||||
Да уж, яснее некуда объяснил. Имел ввиду несколько операторов [] подряд для такого обращения к многомерному массиву:
Здесь компилятор требует к оператору [] массив или указатель. Так, что вернуть содержимое ячейки не получится для нескольких [].
Ну нельзя, значит нельзя. Не настаиваю.
Где код привёл?
Про отстой, заметьте, не я сказал Есть такой язык MQL4. Там данные можно объединить только в массивы. Память, которой можно пользоваться, только недавно сделали 4 Гб. До этого было всего 2 Гб. Данные, которые требуется обрабатывать, составляют десятки Гб. На данный момент программный комплекс у меня обрабатывает максимум 5-мерный массив. Приходится по-всякому экономить. Хорошо, что ещё DLL разрешили подключать, а то совсем плохо было бы. В перспективе надо выводить расчёты за пределы MQL4. Тогда таких ограничений не будет. Но это непросто сейчас. Пока работает и так. Есть более важные задачи. Кстати, реализация, как у буста, у меня тоже есть. Такой же параметр шаблона для объявления количества измерений. Только этот параметр у меня инициализирован по умолчанию и ограничивает максимальное количество измерений. Т.е. можно работать с ним, как с жёстко заданным количеством измерений, так и с изменяемым.
Нет проблемы. Нечего формулировать. Всё работает. Спасибо! |
| Автор: volatile 1.12.2012, 14:18 | ||
В этой строчке, получается, у вас объект в правой стороне выражения изменяется 3 раза? Поверьте, такой side-effect, мало кто, готов ожидать. Zhunko, я конечно не знаю что вы там пишите, но имхо, интутивно чувствую что вы делаете что-то не то. например
я уж не говорю про то, что он вообще в принципе никогда не может быть rvalue. В общем, проблем на свою голову вы найдете... |
| Автор: Zhunko 1.12.2012, 16:23 | ||||||||||
4 раза будет меняться.
К сожалению, такая арифметика для класса не доступна. Пока не знаю, как это сделать. Правильнее сказать, знаю, как сделать некрасиво. Например, перегрузить [] с парой типов аргумента. Завершающий оператор вызывать с конкретным типом. Лучше не буду так делать, чем иметь возможность складывать содержимое ячеек с индексацией в []. Хотя, в этом что-то есть. Таким образом, можно частично на компилятор возложить слежение за правильностью применения []. Отслеживание количества [] сам класс делает. Зато есть метод At(), с которым такая арифметика работает:
|
| Автор: Zhunko 3.12.2012, 07:27 | ||||||
Удалось сделать без дополнительных перегрузок []. Достаточно перегрузки оператора приведения типа:
Правда, лишился возможности перегрузить арифметические операторы для самого объекта. Теперь эти конструкции всегда возвращают содержимое ячейки даже без операторов []. Но это не беда. Сам класс на базе std::vector сделан. Т.е. с ним, как с вектором можно обращаться. Есть перегуженные операторы для std::vector. |