我也answered这个question和Potatoswatter answered也一样
我不熟悉在C++中使用哨兵对象。
我认为它们仅限于输入和输出流。
有人可以向我解释一下C++哨兵对象以及如何将它们用作类中一个或多个方法的环绕拦截器吗?
即如何执行此操作?
最佳答案
哨兵对象是一种模式,但是我不确定下面的哪一个(也许全部)。
C++程序通常在完全销毁对象(可能是用户定义的类)时,即在调用其析构函数时严重依赖知识。对于带有垃圾回收的语言,情况并非如此。
例如,使用此技术来包含“资源获取就是初始化”范例:在调用对象构造函数时获取资源,并且编译器自动调用其析构函数以释放正常和异常(异常)情况下的资源(请检查this question)。 )。
您可以利用常见的施工/破坏时间知识的地方是
void function()
{ Class foo = Object(resource);
other_operations();
} // destructor for foo is called here
void function()
{ another_function ( Class(resource) );
// destructor for the unnamed object is called
// after another_function() returns (or throws)
other_operations();
}
class Foo
{ Class sentry;
public: Foo()
{ // Constructor for sentry is called here
something();
}
public: ~Foo()
{
something();
} // destructor for sentry is called here
};
在STL中,有一个名为
sentry
(更确切地说是istream::sentry
)的类,该类实现上述那些的第三种模式。所以我认为这就是一些程序员所说的“哨兵对象”。但是实际上,上述
Class
类的任何对象都可以称为“哨兵对象”。它们之所以成为“哨兵”,是因为它们确保即使某些事件引发异常,也不会错过这些难以捉摸的对象析构函数(因此,它们就像是块/类的监护人)。该RAII question中有更多的哨兵对象示例。
您可以看到与面向方面的编程的关系。这些对象类似于“方面”,其切点为“在封闭块的开始/结尾”,“在包含对象的构造/破坏中”等。但是这些“方面”必须在其方面的代码中呈现。因此,与原始的
call/return
功能相比,它们的“视域”更少。相反,应该将哨兵对象插入到该类的每个函数中:class X{
struct Sentry {
Sentry() { /* call() */}
~Sentry() { /* return() */};
};
void member_function()
{ Sentry();
/* operations */
}
void another_member_function()
{ Sentry();
/* operations */
}
};
关于c++ - C++中的 “sentry object”是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2690851/