在C++函数中使用本地类

gig*_*gle 36 c++ design-patterns

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

有一个共同的接口IBase.这是草案代码.

class IBase
{
    virtual Method()=0;
}

vector<IBase*> baseList;
Run Code Online (Sandbox Code Playgroud)

然后,函数根据该IBase定义内部类,然后将内部类对象推送到baseList中.

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

其他线程可能使用此baseList来处理传入的事件.

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

Naw*_*waz 44

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

本地类的范围是它们被定义的函数.但这本身并不感兴趣.

是什么使局部类有趣的是,如果他们实现一些接口(比如你的代码做),那么你就可以创建它(使用实例new)并返回它们(例如,如std::vector<IBase*>),从而使实施访问通过基类指针连功能之外.

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

  • 它们无法定义静态成员变量.

  • 它们无法访问封闭函数的非静态"自动"局部变量.但他们可以访问static变量.

  • 它们可用于模板功能.

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

  • 本地类是final,这意味着函数外部的用户无法从本地类派生到函数.如果没有本地类,则必须在单独的翻译单元中添加未命名的命名空间.

  • 本地类用于创建通常称为thunks的trampoline函数.


编辑

标准的一些参考文献(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]
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 值得注意的是,本地函数*不能用作C++ 03下的模板参数. (2认同)
  • “本地课程是最终的” - 这不是有点误导吗?本地类可以派生自在同一函数中定义的另一个本地类。 (2认同)
  • 本地课程如何“最终”?https://godbolt.org/z/M6jWa5 我刚刚从这里继承了一个。 (2认同)

小智 7

\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();
}
Run Code Online (Sandbox Code Playgroud)

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

-艾丁