Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

29.03.2013, 20:40. Просмотров 1406. Ответов 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


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

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

Выполните, пожалуйста, задание, при этом вместо оператора цикла while используйте оператора цикла do_while - C++
Используя оператор цикла while, напишите программу для вычисления ниже следующей суммы. // fkdj.cpp: определяет точку входа...

Перегрузка оператора + - C++
String String::operator + (String & sg2) { String tmp; tmp.str = new char ; strcpy (tmp.str, str); strcat (tmp.str, sg2.str);...

Перегрузка оператора << - C++
Пишу класс My_String #include &lt;iostream&gt; const int MAX = 1000; class My_String { private: char str; public:

Перегрузка оператора < - C++
Здравствуйте. Есть класс треугольник(Triangle), надо перегрузить оператор &lt; для объектов класса Triangle. Написал код, вроде ошибок нет, но...

Перегрузка оператора = - C++
Ещё раз всем привет! Недавно разместила у себя &quot;лайт-вершин&quot; своего вектора - int_array. И все дружно начали мне говорить, что у меня...

Перегрузка оператора += - C++
Есть два класса: Vec4(вектор из 4х float) и Mat4(вектор из 4х Vec4). Проблема в том что при перегрузке в Mat4 операции += я получаю ошибку...

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

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

Добавлено через 3 минуты
nexen, да, вы правы, return я 2 раза зря написал, можно было и одним управиться как вы думаете, все остальное верно?
0
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 может не быть конструктора копирования..
1
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.03.2013, 20:55 #7
Цитата Сообщение от nexen Посмотреть сообщение
Меня беспокоит тот факт, что у Foo может не быть конструктора копирования..
Или только по умолчанию... А что там в классе неизвестно... Хотя насчёт перегрузки сказано...
1
monnzz
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 34
29.03.2013, 20:56  [ТС] #8
ммм, да я просто предупредил, что надо бы определить конструктор копирования для этого класса
и о самом Foo классе мало, что известно, я еще предложил через get-методы, но ведь они тоже должны быть определены
0
Jupiter
29.03.2013, 20:57
  #9

Не по теме:

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

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

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

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

Добавлено через 15 секунд
alsav22 дело говорит
0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.03.2013, 21:27 #14
ваша перегрузка небезопасна с точки зрения исключений.
следует использовать идиому copy and swap
2
Kastaneda
Jesus loves me
Эксперт С++
4717 / 2921 / 242
Регистрация: 12.12.2009
Сообщений: 7,434
Записей в блоге: 2
Завершенные тесты: 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

Не по теме:

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

2
29.03.2013, 22:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 22:08
Привет! Вот еще темы с ответами:

Перегрузка оператора [][] - C++
добрый день. имею в классе двумерный массив. подскажите как правильно сделать перегрузку к классу, чтоб при ЭкземлплярКлассa...

Перегрузка оператора = - C++
Ввести строку символов S1. Программа должна содержать перегруженную операцию “=”, использование которой скопирует S1 в S2 при следующих...

Перегрузка оператора += - C++
Создал класс дробь. Пытаюсь перегрузить оператор += (или -=, *=, /=) А компилятор выдаёт ошибку 'drob operator+=(drob&amp;)' must take...

Перегрузка оператора [] - C++
Сделал простой аналог auto_ptr для дин. массива. Файл #ifndef ARRAY_PTR_GUARD #define ARRAY_PTR_GUARD template&lt; class Ty_ &gt; ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.