crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> преобразование типа и классы
voipp
  опции профиля:
сообщение 4.4.2010, 23:08
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

Спасибо сказали: 0 раз(а)




Репутация:   0  


Значит есть класс CTable от него наследуется CMatrix а от него SLAU.наследование открытое. в CTable определен operator=(const CTable& table). Строчки вида
CTable A;
SLAU B;
B=A;
без ошибок компилируются.А вот строчки вида
SLAU A,B;
CMatrix A1,A2;
A=(B+A1*A2);
вводят компилятор в недоумение(операции сложения и умножения выполняются без ошибок).Вот что он пишет: не найден оператор= принимающий правый аргумент типа CMatrix
Теперь в недоумении я.Почему это происходит и как это исправить?

Сообщение отредактировал voipp - 4.4.2010, 23:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 4.4.2010, 23:49
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


voipp,
по-моему все верно происходит нет же оператора = для CMatrix!
вот если заменить тут
SLAU A,B;
CMatrix A1,A2;
A=(B+A1*A2);

CMatrix на CTable
соберётся думаю.
может надо написать оперетор = для CMatrix.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
voipp
  опции профиля:
сообщение 4.4.2010, 23:53
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

Спасибо сказали: 0 раз(а)




Репутация:   0  


строчки такого вида будут без ошибок:
CMatrix A;
SLAU B;
B=A;




Сообщение отредактировал voipp - 5.4.2010, 0:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.4.2010, 7:20
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(voipp @ 5.4.2010, 3:53) *
строчки такого вида будут без ошибок:
CMatrix A;
SLAU B;
B=A;
а наоборот:
A=B;
?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
voipp
  опции профиля:
сообщение 5.4.2010, 8:36
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 5.4.2010, 8:20) *
Цитата(voipp @ 5.4.2010, 3:53) *
строчки такого вида будут без ошибок:
CMatrix A;
SLAU B;
B=A;
а наоборот:
A=B;
?

Я перепутал.Как раз строки А=В без ошибок а строки В=А с ошибками


Сообщение отредактировал voipp - 5.4.2010, 8:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.4.2010, 8:58
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


voipp, добавь в класс SLAU конструктор копий такого вида: SLAU(const CTable&){} и все будет компилиться!
И подумай, почему он нужен! ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 5.4.2010, 9:26
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


ViGOur,
давайте обсудим эту тему.
по-моему конструктор копий понадобился если бы было так:
CMatrix A;
SLAU B=A;


а у него:
CMatrix A;
SLAU B;
B=A;


по-моему оператор = принимающий CMatrix нужен.
он же переопределил оператор = в родительском классе теперь , это на его совести.

или я ошибаюсь? поправьте.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.4.2010, 9:32
Сообщение #8


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Как вариант можно и оператор присваивания: SLAU &operator=(const CTable&){}.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 5.4.2010, 16:36
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Вообще-то, "по правильному" и operator=, и конструктор копирования должны принимать в качестве аргумента (константную ссылку на) объект своего же класса. Все преобразования должны осуществляться явно соответствующими операторами, причем, если это конструкторы - то стоит объявить их explicit во избежание выполнения не предусмотренных программистом преобразований.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.4.2010, 16:55
Сообщение #10


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Ну почему же!
Что не правильно в том, что оператор присваивания класса Integer будет принимать в качестве параметра int?

Добавлено:

Или если взять пример:

class Животное{...};
class Лошадь: public Животное{...};

Почему не правильно: Лошадь::operator=( Животное&) ?
Лошадь это же животное и почему ей нельзя присвоить все свойства присущие животному, того или иного возраста или пола?

з.ы. я знаю, что это не правильно.
Просто хочу услышать почему, так как уже не помню почему! :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.6.2020, 21:38