繁体   English   中英

C++函数中局部类的使用

[英]Usage of local class in C++ function

我在 C++ 函数中看到了一些内部结构的用法。

有一个通用接口IBase。 这是代码草案。

class IBase
{
    virtual Method()=0;
}

vector<IBase*> baseList;

然后一个函数根据那个 IBase 定义了一个内部类,然后将内部类对象推送到 baseList 中。

void func()
{
    struct Object : public IBase
    {
        virtual Method()
        {
            // Method of Object in func
        }
    }

    IBase* base = new Object();
    baseList->push(base);

}

这似乎是一个奇怪的用法,但却是消息/事件创建模式的一个很好的实现。

其他线程可能使用这个 baseList 来处理传入的事件。

“struct Object”的内部结构的范围是什么? 这很有趣。 有没有一些文件在谈论这个?

“struct Object”的内部结构的范围是什么?

本地类的范围是定义它们的函数。但这本身并不有趣。

本地类的有趣之处在于,如果它们实现了某个接口(就像您的代码那样),那么您可以创建它的实例(使用new )并返回它们(例如,作为std::vector<IBase*> ),从而使即使在函数外部,也可以通过基类指针访问实现

关于本地类的其他一些事实:

  • 它们不能定义静态成员变量。

  • 它们不能访问封闭函数的非静态“自动”局部变量。 但是他们可以访问static变量。

  • 它们可以在模板函数中使用。

  • 如果它们是在模板函数内定义的,则它们可以使用封闭函数的模板参数。

  • 本地类是最终的,这意味着函数之外的用户不能从本地类派生到函数。 如果没有本地类,您必须在单独的翻译单元中添加一个未命名的命名空间。

  • 本地类用于创建通常称为thunk 的蹦床函数


编辑

标准 (2003) 中的一些参考资料

9.8 本地类声明 [class.local]

\\1. 类可以在函数定义中定义; 这样的类称为局部类。 本地类的名​​称在其封闭范围内是本地的。 本地类在封闭作用域的范围内,并且与封闭函数一样具有对函数外部名称的访问权限。 局部类中的声明只能使用封闭范围内的类型名称、静态变量、外部变量和函数以及枚举数。

[Example:

int x;
void f()
{
   static int s ;
   int x;
   extern int g();

   struct local {
      int g() { return x; } // error: x is auto
      int h() { return s; } // OK
      int k() { return ::x; } // OK
      int l() { return g(); } // OK
   };
// ...
}
local* p = 0; // error: local not in scope

—end example]

\\2. 封闭函数对本地类的成员没有特殊访问权; 它遵守通常的访问规则(第 11 条)。 局部类的成员函数应该在它们的类定义中定义,如果它们被定义的话。

\\3. 如果类 X 是本地类,则嵌套类 Y 可以在类 X 中声明,然后在类 X 的定义中定义,或者稍后在与类 X 的定义相同的范围内定义。嵌套在本地类中的类是本地类。

\\4. 本地类不应具有静态数据成员。

\\4. 本地类不应具有静态数据成员。

但是你可以在本地班级内做到这一点

int GetCount()
{
    class _local
    {
    public:
        static int Count(int count = std::numeric_limits<int>::max())
        {
            static int count_ = 0;
            if (count != std::numeric_limits<int>::max()) count_ = count;
            return count_;
        }

        static float Operation(float  a, float  b)
        {
            _local::Count(_local::Count() + 1);
            return a;
        }
    };
   _local::Count(0);
   CALLBACK( _local::Operation);
   return _local::Count();
}

_local::Count 可用于读取和写入其他静态变量

-艾丁

这是普通的 C++。 struct Object作用域只是函数func 但是,您仍然可以在不知道它们是哪种具体类型的情况下使用这种类型的对象,因为它们继承自IBase 这用于封装实现。

Jason Turner 在他的 CppCon 演讲中介绍了一个非常有趣的本地类用法,重点是用 C++17 编写 Commodore 64 游戏。 他展示了如何在函数级别使用 RAII 原则。

他基本上在返回此类实例的函数中的本地类的构造函数中建立不变量。 因此,不变量的持续时间由返回对象的生命周期控制。 它与像std::lock这样的 RAII 包装器所做的非常相似,只是略有不同。

你可以在这里看到合适的部分,但我喜欢他的表演,并建议一直看下去。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM