![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
voipp |
![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 116 Регистрация: 20.10.2009 Из: Msk Пользователь №: 1166 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Значит есть класс CTable от него наследуется CMatrix а от него SLAU.наследование открытое. в CTable определен operator=(const CTable& table). Строчки вида
без ошибок компилируются.А вот строчки вида вводят компилятор в недоумение(операции сложения и умножения выполняются без ошибок).Вот что он пишет: не найден оператор= принимающий правый аргумент типа CMatrixТеперь в недоумении я.Почему это происходит и как это исправить? Сообщение отредактировал voipp - 4.4.2010, 23:19 |
|
|
![]() |
kwisp |
![]()
Сообщение
#2
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
voipp,
по-моему все верно происходит нет же оператора = для CMatrix! вот если заменить тут
CMatrix на CTable соберётся думаю. может надо написать оперетор = для CMatrix. |
|
|
voipp |
![]()
Сообщение
#3
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 116 Регистрация: 20.10.2009 Из: Msk Пользователь №: 1166 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
строчки такого вида будут без ошибок:
Сообщение отредактировал voipp - 5.4.2010, 0:21 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
voipp |
![]()
Сообщение
#5
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 116 Регистрация: 20.10.2009 Из: Msk Пользователь №: 1166 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
ViGOur |
![]()
Сообщение
#6
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
voipp, добавь в класс SLAU конструктор копий такого вида: SLAU(const CTable&){} и все будет компилиться!
И подумай, почему он нужен! ![]() |
|
|
kwisp |
![]()
Сообщение
#7
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
ViGOur,
давайте обсудим эту тему. по-моему конструктор копий понадобился если бы было так: а у него:
по-моему оператор = принимающий CMatrix нужен. он же переопределил оператор = в родительском классе теперь , это на его совести. или я ошибаюсь? поправьте. |
|
|
ViGOur |
![]()
Сообщение
#8
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Как вариант можно и оператор присваивания: SLAU &operator=(const CTable&){}.
|
|
|
Влад |
![]()
Сообщение
#9
|
Участник ![]() ![]() Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: ![]() ![]() ![]() |
Вообще-то, "по правильному" и operator=, и конструктор копирования должны принимать в качестве аргумента (константную ссылку на) объект своего же класса. Все преобразования должны осуществляться явно соответствующими операторами, причем, если это конструкторы - то стоит объявить их explicit во избежание выполнения не предусмотренных программистом преобразований.
|
|
|
ViGOur |
![]()
Сообщение
#10
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Ну почему же!
Что не правильно в том, что оператор присваивания класса Integer будет принимать в качестве параметра int? Добавлено: Или если взять пример: class Животное{...}; class Лошадь: public Животное{...}; Почему не правильно: Лошадь::operator=( Животное&) ? Лошадь это же животное и почему ей нельзя присвоить все свойства присущие животному, того или иного возраста или пола? з.ы. я знаю, что это не правильно. Просто хочу услышать почему, так как уже не помню почему! ![]() |
|
|
AD |
![]()
Сообщение
#11
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Да все очень просто. Лучше не делать таких вот операторов из-за неявного преобразования типов. о вреде неявного преобразования написано очень много. Думаю, сможешь найти!
![]() |
|
|
Iron Bug |
![]()
Сообщение
#12
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
да, я тоже стараюсь избегать неявного преобразования типов.
к тому же, тут компилятор иногда может оказать "медвежью услугу": у мелкософта, к примеру, он сам генерит пустые конструкторы и конструкторы копий по умолчанию. а это, на самом деле, потенциальная дыра. я уже один раз напарывалась на это. уж если нужно преобразование, то его нужно указывать явно. а если оно ещё и сложное - то самому прописывать это преобразование, не надеясь на то, что может придумать компилятор. |
|
|
ViGOur |
![]()
Сообщение
#13
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
kwisp |
![]()
Сообщение
#14
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Ну вообще-то это кажется по стандарту. ![]() в том то и дело как я понял. если ты не пишешь ничего руками ни конструктор копий ни конструктор по умолчанию, то это за тебя сделает компилятор, однако если ты хотя бы в одном классе родительском переопределишь конструтор копий -- компилятор умывает руки, дальше делай всё сам. я так понимаю. |
|
|
Влад |
![]()
Сообщение
#15
|
Участник ![]() ![]() Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: ![]() ![]() ![]() |
Не совсем так. Дефолтный конструктор, конструктор копирования, оператор = и деструктор относятся к специальным член-функциям.
Дефолтный конструктор генерируется компилятором автоматически, если не указан явно ни один пользовательский конструктор. Как правило, такой дефолтный конструктор пустой и успешно оптимизируется компилятором. Однако, для всех баз и членов вызываются их дефолтные конструкторы, если таковые существуют, иначе генерируется ошибка компиляции. Для баз - в порядке их объявления в списке наследования, для членов - в порядке их объявления. Конструктор копирования не наследуется. Если не указан явно пользовательский конструктор копирования, то генерируется дефолтный конструктор копирования, который тупо почленно копирует все базы и члены класса. Порядок копирования тот же. То же самое верно и для оператора =. Если не указан явно пользовательский оператор назначения (присваивания), то генерируется дефолтный оператор =, который тупо вызывает операторы = для всех баз и членов. Порядок тот же. Тот же самый принцип действует и для деструкторов, с одним отличием: деструкторы всегда вызываются в порядке, обратном вызовам конструкторов. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 24.5.2025, 4:32 |