Однострочное объявление и создание экземпляра класса

Я наткнулся на код, использующий следующий синтаксис.

int main(){    
  class foo{
    public:
      int x;
      foo(int y){x=y;}
  }
  * bar = new foo(1);    
}

Есть ли какая-либо цель/последствие его использования по сравнению с более распространенным

int main(){    
  class foo{
    public:
      int x;
      foo(int y){x=y;}
  };

  foo * bar = new foo(1);    
}

person xvan    schedule 07.08.2018    source источник
comment
Лично я предпочитаю последнее, но оно должно быть auto bar = std::make_unique<foo>(1);   -  person NathanOliver    schedule 07.08.2018
comment
Вот почему люди думают, что C++ сложен, не используйте первый   -  person JVApen    schedule 07.08.2018
comment
У кого-то был разве я не умный момент   -  person Richard Critten    schedule 07.08.2018


Ответы (1)


Это, вероятно, вопрос мнения, но я думаю, что первый метод - это плохая практика кодирования.

  1. Это не влияет на поведение во время выполнения.
  2. Это затрудняет чтение кода.
person R Sahu    schedule 07.08.2018
comment
Считаете ли вы, что размещение определений классов внутри функций является хорошей практикой кодирования? (честный вопрос) - person ; 07.08.2018
comment
@ gooroo7, я не помню, чтобы использовал его в своей работе за последние 20 с лишним лет. Я не могу сказать, используют ли его другие законно. Моя оценка такова, что с появлением выражений lambda локальные классы/структуры, вероятно, не нужны. Вы можете обойтись с std::pair и std::tuple для большинства struct-подобных потребностей в функции. - person R Sahu; 07.08.2018
comment
@ gooroo7 Для контекста исходный код имел несколько функций производителя, каждая из которых возвращала указатель на другую реализацию виртуального класса. - person xvan; 07.08.2018
comment
stackoverflow.com/ вопросов/10072208/ Как описал @RSahu, на самом деле нет причин для анонимных классов, использующих современный C++, но вам может понадобиться такая конструкция при использовании существующего кода C. - person Ben Jones; 07.08.2018
comment
В прошлом я использовал локальные классы для получения прибыли от RAII, т.е. грамм. в качестве охранников очистки с задачами, специфическими для этой функции. Однако сегодня у меня была бы общая защита шаблона, принимающая лямбду в конструкторе и выполняющая ее в деструкторе... - person Aconcagua; 07.08.2018