Closed. This question is opinion-based。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                        
                        5年前关闭。
                                                                                            
                
        
有没有一种方法可以将成员函数的执行次数强制为一个?为了解释,可以说我有

class foo {
public:
    void Once();
};


我希望foo的每个实例都恰好一次调用成员函数foo :: Once()。如果已进行呼叫,则禁止再次呼叫,如果未进行任何呼叫,则在销毁之前进行呼叫。


是否有与此相关的成语或设计模式?
放置foo::was_called_flag成员(我将其设置为0或1)的硬编码解决方案是否可以接受?或者是否有漏洞需要考虑?
有没有一种解决方案可以很好地扩展到任意数量的执行

最佳答案

Afaik,对此没有预建的解决方案。但是,它很容易自己编写。这里是您需要考虑的几点:


标记/计数器可以。但是,如果可以同时访问对象,则应该使用std::atomic<>类型的标志/计数器。不要使用锁,这完全是矫kill过正。
如前所述,您需要检查函数中的标志/计数器。
您还需要将对函数的调用插入析构函数中。与所有析构函数一样,它应该是虚拟的。但是,请注意,如果对象是类的某个子类,则所有子类析构函数都将在析构函数有机会调用Once()之前运行。因此,您可能在功能失调的对象上调用Once()
如果必须确保在销毁可能的子类之前运行Once(),则必须将调用从析构函数移动到设置另一个标志的finalize()方法中,并在析构函数中对该标志进行断言。

10-08 11:52