具有不同值/实例的静态成员

时间:2014-03-25 22:01:29

标签: c++ oop static-members

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

我有一个" top"带有指针数组的类,指向一大堆" sub" -classes。 所有" sub" -classes都有一些计算要做,如果完成,他们必须向" top"提供反馈。所以我认为简单地使用静态int"计算" 并且如果每个人都完成它是0.(否则它是例如1或5,取决于有多少" sub" s尚未计算(例如,在加载新的原始数据之后)。)

好到目前为止一切都那么好,但是如果我想加速,用自己的子对象制作一个新的" top" -object会发生什么呢,那么它们都将具有相同的静态值( !)。当然我先测试一下。然后我试着制作" sub"私人课程" top" (只是一个新手的想法)。但是没有......,静态是静态的,它们都具有相同的值;)

我仍然有想法,比如让所有" sub"中的指针指向顶部的成员,然后让他们改变它。对于不同的上衣,这个指针会有所不同。

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

顺便说一句:如果通过pointerarithmetics子访问top的私有值会导致错误吗?

来自新手的问候

本尼

2 个答案:

答案 0 :(得分:0)

不要依赖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){}

};

答案 1 :(得分:0)

首先,不要让计数器静止。如果您希望该值是“顶级”类的每个实例,那么请将其设为常规成员。 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实例一样安全,就像上面的解决方案一样< / p>