【问题标题】:static member with different values / instances具有不同值/实例的静态成员
【发布时间】:2014-03-25 22:01:29
【问题描述】:

我花了一整天的时间来深入了解 C++ 中的 OOP。 这可能是个愚蠢的问题,我想这只是我脑子里的一个结或错误的设计,但也许你知道该怎么做。

我有一个带有指向一大堆“子”类的指针数组的“顶级”类。 所有“子”类都有一些计算要做,如果它们完成了,他们必须向“顶部”提供反馈。所以我认为使用静态int“计算”让它变得简单 如果每个人都完成了,则为 0。(否则为 1 或 5,具体取决于尚未计算多少“子”(例如,在加载新的原始数据之后))。

好吧,到目前为止一切都很好,但是如果我想加快速度,用它自己的子对象创建一个新的“顶部”对象会发生什么,那么它们都将具有相同的静态值(!)。当然,我首先测试了它。然后我试图让“sub”成为“top”的私有类(只是一个新手的想法)。但是不...,静态是静态的,它们都具有相同的值;)

我仍然有想法,例如让所有“sub”中的指针指向顶部的成员,然后让他们更改它。这个指针对于不同的顶部会有所不同。

我想知道是否有任何“官方”解决方案可以为不同的对象组(一个类)分配不同的静态值。

顺便说一句:如果 sub 通过指针算法访问 top 的私有值会导致错误吗?

来自新手的问候

本尼

【问题讨论】:

  • 你为什么对static如此着迷?这只是错误的想法。

标签: c++ oop static-members


【解决方案1】:

不要依赖static 变量,而是让您的子类知道它们属于哪个父类:

class sub;
class top{
   vector<sub*> subClasses;
public:
   void addSubClass(){ sub* ptr = new sub(this); }
   void subFinished(sub* child){ /* do whatever - perhaps delete from vector */ }
};

class sub{
   top *myParent;
public:
   void calculate(){ /* calculate something and let parent know */ myParent->subFinished(this); }
   sub(top* parent):myParent(parent){}

};

【讨论】:

    【解决方案2】:

    首先,不要将计数器设为静态。如果您希望该值是“顶级”类的每个实例,则将其设为普通成员。 static 将使它成为顶级类所有实例的全局变量。

    其次,如果“top”创建了所有“sub”对象,当你创建它们时,你可以在创建时将引用(或指针,如果你喜欢)传递给子对象

    class sub
    {
    public:
        explicit sub(int& counter) : m_counter(counter) {}
    
        void calc()
        {
            // do some stuff
    
            // decrement counter 
            --m_counter;
        }
    
    private:
        int& m_counter;
    };
    

    或者,您可以将顶级类的引用传递给您的子类,子类可以直接或通过顶级类的公共成员减少计数器成员

    class sub
    {
    public:
        explicit sub(top& t) : m_t(t) {}
    
        void calc()
        {
            // do some stuff
    
            // decrement counter 
            m_t.decrement();
        }
    
    private:
        top& m_t;
    };
    

    您还可以构造子类,并在创建后将子实例中的指针设置为计数器变量或顶部实例,但这不如确保 sub 的每个实例都像我上面的解决方案那样被初始化那样安全

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 2016-08-31
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2012-12-15
      相关资源
      最近更新 更多