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)
\ 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.本地类不应具有静态数据成员.
小智 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 可用于读取和写入其他静态变量
-艾丁