我回答这个问题,并Potatoswatter 回答过的
现代C++等价物将是一个哨兵对象:在函数的开头构造它,其构造函数实现call(),并在返回(或异常退出)时,它的析构函数实现
我不熟悉在C++中使用sentry对象.我认为它们仅限于输入和输出流.
有人可以向我解释C++哨兵对象以及如何将它们用作类中一个或多个方法的周围拦截器吗?
即如何做到这一点?
Sentry对象确实非常相似.一方面,它们需要显式实例化(并且通过它),但另一方面,您可以添加它们,这样它们不仅可以检查类的不变量,还可以检查手头函数的一些前/后条件.
P S*_*ved 16
Sentry对象是一种模式,但我不确定下面哪一个(可能是全部).
当一个对象(可能是用户定义的类)被破坏时,即当它的析构函数被调用时,C++程序通常严重依赖于知识.具有垃圾收集的语言不是这种情况.
例如,该技术用于包含"资源获取是初始化"范例:在调用对象构造函数时获取资源,并且编译器自动调用其析构函数以在正常和异常(异常)情况下释放资源(检查此问题).
您可以利用建筑/破坏时间知识的常见地方是
块:在块的末尾调用"堆栈分配"对象的析构函数
void function()
{ Class foo = Object(resource);
other_operations();
} // destructor for foo is called here
Run Code Online (Sandbox Code Playgroud)函数调用:调用函数时也会发生"堆栈分配"
void function()
{ another_function ( Class(resource) );
// destructor for the unnamed object is called
// after another_function() returns (or throws)
other_operations();
}
Run Code Online (Sandbox Code Playgroud)构造/销毁包含物体:
class Foo
{ Class sentry;
public: Foo()
{ // Constructor for sentry is called here
something();
}
public: ~Foo()
{
something();
} // destructor for sentry is called here
};
Run Code Online (Sandbox Code Playgroud)在STL中有一个叫做sentry
(更准确地说istream::sentry
)的类,它实现了上述第三种模式.所以我认为这是一些程序员所称的"哨兵对象".
但事实上,上述任何类对象Class
都可称为"哨兵对象".他们是"哨兵",因为他们确保这些难以捉摸的对象析构函数不会被错过,即使某些东西抛出异常(所以他们就像块/类的监护人一样).
RAII问题中有更多的哨兵对象示例.
您可以看到面向方面编程的关系; 这些对象类似于"方面",切割点"在封闭块的开头/结尾处","在构造/破坏包含对象"等.但是这些"方面" 必须呈现在它们所代表的代码中.因此,与原始call/return
功能相比,它们不那么"随意" ; 相反,应该在类的每个函数中插入一个sentry对象:
class X{
struct Sentry {
Sentry() { /* call() */}
~Sentry() { /* return() */};
};
void member_function()
{ Sentry();
/* operations */
}
void another_member_function()
{ Sentry();
/* operations */
}
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3962 次 |
最近记录: |