我什么时候需要C ++中的匿名类?

时间:2012-04-09 10:58:26

标签: c++ anonymous-class

在C ++中有一个名为匿名类的功能。它与C中的匿名结构类似。我认为这个功能是由于某些需求而发明的,但我无法弄清楚它是什么。

我可以有一些真正需要匿名课程的例子吗?

6 个答案:

答案 0 :(得分:19)

这个功能就在那里,因为structclass是相同的东西 - 你可以用一个做任何事情,你可以用另一个做。它的作用与C中的匿名struct完全相同;当你想把一些东西组合在一起并声明它的一个或多个实例时,不需要按名称引用那个类型。

它在C ++中的使用较少,部分原因是因为C ++设计往往更倾向于类型,部分原因是你无法为匿名类声明构造函数或析构函数。

答案 1 :(得分:4)

严格意义上并非真正需要,而且从未如此。即您总是可以指定一个名称,例如anonymous1anonymous2等。但是跟踪更多名称并不是必要的,这总是很麻烦。

有用的地方是在任何想要对数据进行分组而不给该组命名的地方。我想出几个例子:

class foo {
  class {
  public:
    void validate( int x ) { m_x = x; }
    bool valid() { return m_exists; }
  private:
    int m_x;
    bool m_exists;
  } maybe_x;
};

在这种情况下,intbool在逻辑上属于一起,因此将它们分组是有意义的。但是对于这个具体的例子,创建一个实际的可选类型或使用其中一个可能的类型可能是有意义的,因为这种模式很可能也在其他地方使用。在其他情况下,这种分组模式可能非常特殊,它应该只留在那个类中。

我确实假设,很少使用匿名类(我在生活中只使用了几次)。通常当人们想要分组数据时,这不是特定于类或范围的,而是在其他地方也有意义的分组。

答案 2 :(得分:2)

有时候制作嵌套函数有点有用:

void foo() {
  class {
    void operator()(){
    }
  } bar;
  bar();
}

但现在我们有lambda和匿名类只是出于兼容性原因。

答案 3 :(得分:2)

使用匿名类是为了保持与现有C代码的兼容性。 例如:

在某些C代码中,将typedef与匿名结构结合使用非常普遍。

答案 4 :(得分:1)

有一个匿名结构的例子,它可以与Qt 5的Signal / Slot系统一起使用,具有任何类,没有QObject衍生要求:

void WorkspaceWidget::wwShowEvent()
{
    //Show event: query a reload of the saved state and geometry
    gcmessage("wwShowEvent "+ this->title());
    struct{void* t; void operator()(){ static_cast<WorkspaceWidget*>(t)->wwReloadWindowState(); }}f;
    f.t=this;
    QObject::connect( &reloadStateTimer, &QTimer::timeout, f);
    reloadStateTimer.start();
}

void WorkspaceWidget::wwReloadWindowState()
{
    gcmessage( dynamic_cast<QObject*>(this)->metaObject()->className());
}

基本上,我需要将一个定时器信号连接到一个非QObject派生类,但是想要正确地传递mt“this”。

QObject :: connect可以连接到Qt 5中的普通函数,所以这个匿名类实际上是一个仿函数,它将this指针保留在自身中,仍然通过插槽连接。

答案 5 :(得分:0)

你也可以用匿名汽车(vs2015)

做事
struct {

    auto* operator->() {return this;}
    //do other functions

} mystruct;
相关问题