Паттерн: что выдаст этот код?

Опубликовано Mar 21, 2012 в ООП, Разбор примеров кода | 10 коммент.

, ,

Паттерн: что выдаст этот код?

Имеется вариант реализации некоторого класса. Метод initialize() может быть написан двумя способами.

using namespace std;
class foo
{
public:
    int data; 
 
    //First option                            //Second option
    static void initialize(){                  static void initialize(){
      if (!inst) inst = new foo;                  delete inst;
    }                                             inst = new foo;
                                               }
 
    static void shutdown(){
        delete inst;
        inst = 0;
    }
    static foo& const instance(){
        return *inst;
    }
 
private:
    static  foo* inst;
 
    foo()
    { data = 22; }
 
    ~foo() {}
};
foo* foo::inst = 0;

Вопросы

1. На какой классический паттерн похож данный класс и чего в нем не хватает?

2. Что выдаст приведеный ниже код, который содержит различные способы использования данного класса?

3. Будут ли различия в выводе в зависимости от способа реализации метода initialize()?

Вариант 1

int main()
{
    foo::initialize();
    foo& instance =  foo::instance();
    instance.data = 33;
 
    cout << foo::instance().data << " " << instance.data << endl;
 
    foo::initialize();
}
    cout << foo::instance().data <<  " " << instance.data << endl;

Вариант 2

int main()
{
    foo::initialize();
    foo& instance =  foo::instance();
    int inst_data = instance.data;
    instance.data = 33;
    foo& instance1 =  foo::instance();
    int inst1_data = instance1.data;
 
    cout << inst_data <
int main()
{
    foo::initialize();
    foo& instance =  foo::instance();
    instance.data = 33;
 
    cout << foo::instance().data << endl;
 
    foo::shutdown();
    foo::initialize();
 
    cout << foo::instance().data << endl;
}

Автор публикации:

10 Коммент. : “Паттерн: что выдаст этот код?”

  1. Как-то уж слишком просто…Даже не интересно ))

    • Хочу очень удивить вас, но многие кандидаты с годами опыта работы на С++, не смогли корректно ответить на поставленное “простое” задание аналогичное данному.

      Обычно собеседование начинается именно с таких простых задач. Далее, если кандидат не имеет четкого понимания как работает static и при этом претендует на позицию выше junior C++, мы заканчиваем процесс собеседования и даем всевозможные рекомендации по дальнейшему обучению.

    • Хм, смысла задавать на собеседовании философский вопрос, над которым ты можешь промедитировать всю оставшуюся жизнь, как бы нет…

      • Медитировать всю жизнь по поводу как static работает? Это разве философский вопрос?

        • Не-не-не, это так, предположение о сложности вопросов в общем случае…

          • Согласен, вопросы нужно обязательно разделять по сложности. Эта функция была доступна в старом дизайне нашего сайта, но как-то при переходе на новый забыли перенести. Обязательно сделаем.

        • Да и причём тут этот модификатор, я вроде запостил в ответ на Юрьев пост. А “философский вопрос” — это на который ответить в принципе не возможно, т.е. такие никто из адекватных людей не будет задавать. Просто небольшое утрирование.)

          • Кстати, Joel Spolsky в своей статье “Искусство интервью” как раз пишет о том, что он обязательно задаёт “невозможные вопросы” на собеседовании с программистами :)
            “Смысл в том, чтобы задать вопрос, на который у них не найдется ответа, просто чтобы посмотреть, что они будут делать. “Сколько окулистов в Сиэтле” “Сколько тонн весит монумент Вашингтона?”…”
            А Вы как к таким вопросам относитесь? ))

          • Относимся хорошо, но не задаем их. И беда этих вопросов, что они уже ну уж очень всем известны.

  2. Артур says:

    В варианте 2: первая функция main не обрезана:

    cout << inst_data <

Оставить комментарий

Ваш адрес email не будет опубликован.


*