【问题标题】:Single line class declaration and instantiation单行类声明和实例化
【发布时间】:2018-08-08 02:39:31
【问题描述】:

我偶然发现了使用以下语法的代码。

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);    
}

【问题讨论】:

  • 我个人更喜欢后者,但它必须是auto bar = std::make_unique<foo>(1);
  • 这就是为什么人们认为C++很复杂,不要使用第一个
  • 有人有一个“我不是很聪明吗”

标签: c++ class objectinstantiation


【解决方案1】:

这可能是一个见仁见智的问题,但我认为第一种方法是糟糕的编码实践。

  1. 它不会影响运行时行为。
  2. 它使代码更难阅读。

【讨论】:

  • 您认为将类定义放在函数中是一种好的编码习惯吗? (诚实的问题)
  • @gooroo7,我不记得在过去 20 多年的工作中使用过它。我不知道其他人是否有合法用途。我的评估是,随着lambda 表达式的出现,可能不需要本地类/结构。您可以使用std::pairstd::tuple 来满足函数中大多数struct 的需求。
  • @gooroo7 对于上下文,原始代码有多个“maker”函数,每个函数返回一个指向不同虚拟类实现的指针。
  • stackoverflow.com/questions/10072208/… 正如@RSahu 所描述的,匿名类确实没有理由使用现代 C++,但在使用现有 C 代码时可能需要这样的构造。
  • 过去,我使用本地课程从 RAII 中获利,例如。 G。作为具有特定于该功能的任务的清理守卫。不过,今天,我将有一个通用模板守卫在构造函数中接受 lambda 并在析构函数中执行它......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多