我也answered这个questionPotatoswatter 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/

    10-14 08:27