Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
monnzz
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
#1

перегрузка оператора= (задание на собеседовании) - C++

29.03.2013, 20:40. Просмотров 1335. Ответов 16
Метки нет (Все метки)

Задание выглядело следующим образом:
Перегрузка оператора присваивания
Пусть есть класс
C++
1
2
3
4
5
class Boo : public SuperBoo {
 Foo* fFoo1;
 Foo* fFoo2;
 // ...
 }
Где Foo - мономорфный класс, а класс Boo владеет указателями fFoo1, fFoo2.
Задача: перегрузить оператор присваивания для класса Boo.


Я сделал следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const Boo& Boo::operator = (const Boo& rhs)
{
 
    if (this == &rhs)
        return *this;
    else
    {
        delete fFoo1;
        fFoo1 = new Foo ((*rhs.fFoo1));
        delete fFoo2;
        fFoo2 = new Foo ((*rhs.fFoo2));
    }
    return *this;
 
}
Замечу, что в данном случае так же стоит перегрузить конструктор копирования класса Foo


Мое решение собеседовавшим не понравилось

Пожалуйста подскажите, что не так, вроде память освободил, под новые объекты выделил, на самоприсваивание проверил, константность возвращаемого и получаемого параметра задал, не могу понять, что сделал не так
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 20:40     перегрузка оператора= (задание на собеседовании)
Посмотрите здесь:

C++ Перегрузка оператора >
Перегрузка оператора + C++
Перегрузка оператора = C++
перегрузка оператора += C++
C++ Перегрузка оператора []
C++ Перегрузка оператора +
C++ Перегрузка оператора <<
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.03.2013, 20:44     перегрузка оператора= (задание на собеседовании) #2
А где здесь, собственно, присваивание?
Kuzia domovenok
1888 / 1743 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
29.03.2013, 20:45     перегрузка оператора= (задание на собеседовании) #3
можно было бы сделать placement new возможно.
C++
1
fFoo1=new (fFoo1) Foo(*rhs.fFoo1);
Или присвоить по значению с помощью оператора =
C++
1
*fFoo1=*rhs.fFoo1
мне это задание тоже трудновато.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 20:45     перегрузка оператора= (задание на собеседовании) #4
monnzz, а на кого вы устраивались (или в какую компанию), что вам дали это задание? *мне просто интересно очень*
p.s А зачем дважды return *this писать? Получается, что один из блоков if - лишний (первый)
monnzz
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
29.03.2013, 20:52  [ТС]     перегрузка оператора= (задание на собеседовании) #5
на стажера-программиста С++, компанию называть не буду в связи с этическими соображениями
первый return *this; чтобы вернуть в случае самоприсваивания, второй в когда уже все поля переприсвоены

Добавлено через 56 секунд
alsav22, не могли бы Вы пояснить? я присваиваю поля одного объекта другому

Добавлено через 3 минуты
nexen, да, вы правы, return я 2 раза зря написал, можно было и одним управиться как вы думаете, все остальное верно?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 20:53     перегрузка оператора= (задание на собеседовании) #6
Цитата Сообщение от monnzz Посмотреть сообщение
const Boo& Boo::operator = (const Boo& rhs)
{
if (this == &rhs)
* * * * return *this;
* * else
* * {
* * * * delete fFoo1;
* * * * fFoo1 = new Foo ((*rhs.fFoo1));
* * * * delete fFoo2;
* * * * fFoo2 = new Foo ((*rhs.fFoo2));
* * }
* * return *this;
}
Я об этом:
C++
1
2
3
4
5
6
7
8
9
10
11
const Boo& Boo::operator = (const Boo& rhs)
{
if (this != &rhs)
* * {
* * * * delete fFoo1;
* * * * fFoo1 = new Foo ((*rhs.fFoo1));
* * * * delete fFoo2;
* * * * fFoo2 = new Foo ((*rhs.fFoo2));
* * }
* * return *this;
}
Меня беспокоит тот факт, что у Foo может не быть конструктора копирования..
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.03.2013, 20:55     перегрузка оператора= (задание на собеседовании) #7
Цитата Сообщение от nexen Посмотреть сообщение
Меня беспокоит тот факт, что у Foo может не быть конструктора копирования..
Или только по умолчанию... А что там в классе неизвестно... Хотя насчёт перегрузки сказано...
monnzz
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
29.03.2013, 20:56  [ТС]     перегрузка оператора= (задание на собеседовании) #8
ммм, да я просто предупредил, что надо бы определить конструктор копирования для этого класса
и о самом Foo классе мало, что известно, я еще предложил через get-методы, но ведь они тоже должны быть определены
Jupiter
29.03.2013, 20:57
  #9

Не по теме:

мономорфный класс
неудивительно что до сих пор никого не нашли

nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 20:57     перегрузка оператора= (задание на собеседовании) #10
Я вот чего не могу понять.. Почему именно два указателя Foo1, Foo2 и зачем наследование от какого-то SuperBoo?
monnzz
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
29.03.2013, 21:04  [ТС]     перегрузка оператора= (задание на собеседовании) #11
Jupiter, Вы как эксперт С++ не подскажете, что не так?

nexen, я подумал, может еще 2 указателя, как массивы этих объектов? если подходить к вопросу, что это не массивы, то конструктор копирования отлично ложится там сразу можно и поля base классу присвоить

Добавлено через 3 минуты
alsav22, верно, но какие еще варианты? я предложил еще с get методами, но там нужен просто перегруженный конструктор, а про это тоже ничего не известно
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.03.2013, 21:12     перегрузка оператора= (задание на собеседовании) #12
Константность возвращаемого непонятна...
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 21:19     перегрузка оператора= (задание на собеседовании) #13
monnzz, а ещё не понятно мне, зачем было дано, что Foo - мономорфен? Ну не может он наследоваться, и что?

Добавлено через 15 секунд
alsav22 дело говорит
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.03.2013, 21:27     перегрузка оператора= (задание на собеседовании) #14
ваша перегрузка небезопасна с точки зрения исключений.
следует использовать идиому copy and swap
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 1
Завершенные тесты: 1
29.03.2013, 22:08     перегрузка оператора= (задание на собеседовании) #15
Попробую тоже что-нибудь вставить:

- во первых (уже упоминалось) есть базовый класс и operator=(SuperBoo) не был вызван.
- во вторых - для обоих Foo* используется оператор delete, при чем нет гарантии, что эти указатели указывают на динамически выделенную память, поэтому на delete может все сломаться.

об остальном вроде написали, но, имхо, на эти 2 пункта следовало обратить внимание, т.к. в тестовом задании совсем не просто так есть superBoo и скрыто назначение Foo*.

Добавлено через 3 минуты
Цитата Сообщение от nexen Посмотреть сообщение
а ещё не понятно мне, зачем было дано, что Foo - мономорфен? Ну не может он наследоваться, и что?
я думаю это антоним к слову "полиморфен", т.е. Foo* по-любому есть указатель на Foo, а не на Bar, который есть
C++
1
class Bar : public Foo {};
ну т.е. это условие дано как подсказка, что не нужно применять RTTI.

Добавлено через 11 минут
по теме http://stackoverflow.com/questions/1...-operator-in-c

Не по теме:

гугл говорит, что не только на нашем форуме пытались эту задачу решить

monnzz
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
30.03.2013, 16:53  [ТС]     перегрузка оператора= (задание на собеседовании) #16
Jupiter, WOW copy and swap крутейшая тема спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 18:32     перегрузка оператора= (задание на собеседовании)
Еще ссылки по теме:

Перегрузка оператора -> C++
C++ Перегрузка оператора <<
C++ Перегрузка оператора []
Перегрузка оператора C++
C++ Перегрузка оператора <<

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.03.2013, 18:32     перегрузка оператора= (задание на собеседовании) #17
monnzz, а вам нужно только перегрузку показать? Дело в том, что у вас
Цитата Сообщение от monnzz Посмотреть сообщение
Foo* fFoo1;
*Foo* fFoo2;
два поля, под которые нужно выделять память в конструкторе. И их Вам дали тоже не просто так именно два.
Yandex
Объявления
30.03.2013, 18:32     перегрузка оператора= (задание на собеседовании)
Ответ Создать тему
Опции темы

Текущее время: 13:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru