C++中有一个叫做匿名类的特性。它与 C 中的匿名结构类似。我认为这个功能是出于某些需要而发明的,但我不知道那是什么。
我可以举一些真正需要匿名类的例子吗?
C++中有一个叫做匿名类的特性。它与 C 中的匿名结构类似。我认为这个功能是出于某些需要而发明的,但我不知道那是什么。
我可以举一些真正需要匿名类的例子吗?
该功能之所以存在,是因为struct
并且class
是同一件事-您可以对一个做任何事情,也可以对另一个做任何事情。它的用途与 C 中的匿名完全相同struct
;当您想将一些东西组合在一起并声明它的一个或多个实例,但不需要按名称引用该类型时。
它在 C++ 中不太常用,部分原因是 C++ 设计倾向于更面向类型,部分原因是您不能为匿名类声明构造函数或析构函数。
从严格意义上讲,它并不是真正需要的,而且从来没有。即,您总是可以指定一个名称,例如anonymous1
,anonymous2
等等。但是跟踪不必要的名称总是很麻烦。
有用的地方是在任何想要对数据进行分组而不给该组命名的地方。我可以举几个例子:
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;
};
在这种情况下 theint
和 thebool
逻辑上属于一起,因此将它们分组是有意义的。然而,对于这个具体的示例,创建一个实际的可选类型或使用其中一个可用的类型可能是有意义的,因为这种模式也很可能在其他地方使用。在其他情况下,这种分组模式可能非常特别,以至于它应该只留在那个类中。
不过,我确实假设匿名类很少使用(我可能在我的生活中只使用过几次)。通常,当一个人想要对数据进行分组时,这不是特定于类或范围的,而是一种在其他地方也有意义的分组。
使用匿名类是为了保持与现有 C 代码的兼容性。例子:
在某些 C 代码中,将 typedef 与匿名结构结合使用很普遍。
制作嵌套函数有时可能会有所帮助,例如:
void foo() {
class {
void operator()(){
}
} bar;
bar();
}
但是现在我们有了 lambdas 和匿名类,仅出于兼容性原因。
有一个匿名结构的例子,可以与 Qt 5 的 Signal/Slot 系统一起使用,带有 ANY 类并且没有 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 指针,仍然传递槽连接。
您也可以匿名使用 auto 进行操作(vs2015)
struct {
auto* operator->() {return this;}
//do other functions
} mystruct;