如何更改仅标头类中类的所有实例的行为

How to change a behavior for all instances of a class in a header only class

本文关键字:实例 何更改      更新时间:2023-10-16

对于仅在标头中定义的类,我需要为该类的所有实例使用一个方法的特殊行为。它应该取决于默认值,该值可以在运行时随时更改。由于我不想要工厂类或中央管理类,因此我想出了这个想法:

class MyClass
{
public:
    void DoAnything() // Methode which should be act depending on default set.
    {
        // Do some stuff
        if(getDefaultBehaviour())
        {
            // Do it this way...
        }
        else
        {
            // Do it that way...        
        }
    }
    static bool getDefaultBehaviour(bool bSetIt=false,bool bDefaultValue=false)
    {
        static bool bDefault=false;
        if(bSetIt)
            bDefault=bDefaultValue;
        return bDefault;
    }
};

它有效,但看起来有点尴尬。我想知道是否有更好的方法来遵循相同的意图。在我想使用它的情况下,软件已经在启动期间创建了该类的实例,并将它们交付到代码的不同部分。最终,程序会获得如何处理实例的信息(例如,如何或在哪里使自己持久化)。此决定不仅应影响新创建的实例,还应影响已创建的实例。

我建议使用一个简单的方法来模拟静态数据成员,这样用法就会变得更加自然:

class MyClass
{
public:
    // get a reference (!) to a static variable
    static bool& DefaultBehaviour()
    {
        static bool b = false;
        return b;
    }
    void DoAnything() // Methode which should be act depending on default set.
    {
        // Do some stuff
        if(DefaultBehaviour())
        {
            // Do it this way...
        }
        else
        {
            // Do it that way...        
        }
    }
};

用户可以随时更改默认值

MyClass::DefaultBehaviour() = true;

我感谢丹尼尔·弗雷的回答,我已经将其标记为最佳。我想添加我的最终解决方案,该解决方案基于弗雷的答案。该类由一些 c++ 初学者使用。正如我告诉他们总是使用getter和setter方法一样,Frey描述的方法对初学者来说看起来非常复杂("呃,我可以给函数一个值?!?!")。所以我把课写成如下:

class MyClass
{
public:
    // get a reference (!) to a static variable
    static bool& getDefaultBehaviour()
    {
        static bool b = false;
        return b;
    }
    static void setDefaultBehaviour(bool value)
    {
        getDefaultBehaviour()=value;
    }
    void DoAnything() // Methode which should be act depending on default set.
    {
        // Do some stuff
        if(getDefaultBehaviour())
        {
            // Do it this way...
        }
        else
        {
            // Do it that way...        
        }
    }
};

对于用户来说,我现在看起来像一个普通的getter和setter。