У нас и в западных интернетах распространяется информация об одной очень странной тестовой задаче по С++ программированию, которую дают соискателям на собеседовании некоторые компании (даже шарашкины конторы). Достоверно «правильного» её решения я не смог найти. И ниже объяснено почему.

Формулируется задача следующим образом:
Пусть есть следующий класс:


class Boo : public SuperBoo {
    Foo* fFoo1;
    Foo* fFoo2;
    // ...
}

Где Foo — мономорфный (?) класс, а класс Boo владеет указателями fFoo1, fFoo2. Задача: перегрузить оператор присваивания для класса Boo.

Казалось бы, что может быть проще? А вот нет. Ни одно решение, начиная от стандартного, до паттерна Copy & Swap не удовлетворяет работодателей.

Вот такое решение предложил мой друг, которое работает в реальных условиях, однако, опять же, не устроило работодателей.


class Boo : public SuperBoo
{
    Foo* fFoo1;
    Foo* fFoo2;
    void swap (Boo &s) throw () //Метод swap не генерирует исключения
    {
        std::swap(this->fFoo1, s.fFoo1);
        std::swap(this->fFoo2, s.fFoo2);
    }
public:
    Boo & operator=(const Boo &);//Объявляем перегрузку оператора присваивания.
//…
};
//Определяем оператор присваивания
Boo & Boo::operator=(const Boo &rv)
{
    //Используем идиому «copy and paste»
    if(this !=&rv)//Проверка на самоприсваивание
    {
        Boo temp (rv);  /*Создаем копию объекта. 
В случае если копию не получится создать, то будет 
вызвано исключение и деструктор освободит ресурсы temp
*/
        SuperBoo::operator=(rv); //Вызов оператора присваивания базового класса.
        temp.swap(*this);
    }
    return *this;
}

Лично на мой взгляд, для всеобъемлющего решения поставленной задачи в её условии недостаточно данных, что, как говорит математика, порождает бесконечное множество решений. Это происходит хотя бы потому, что нам ничего не известно об интерфейсе класса Foo, что в реальных условиях невозможно. В результате, попытки решения такой недоопределённой задачи провоцируют острый синдром поиска глубинного смысла, а работодатель, видимо, ищет не хорошего программиста, а телепата.

P.S. Я предлагаю называть такие высосанные из пальца задачи «Superboo».

comments powered by HyperComments