我整天都在使用C ++来深入了解OOP。 这可能是一个愚蠢的问题,我想这只是我头脑中的一个结或一个错误的设计,但也许你知道该怎么做。
我有一个" top"带有指针数组的类,指向一大堆" sub" -classes。 所有" sub" -classes都有一些计算要做,如果完成,他们必须向" top"提供反馈。所以我认为简单地使用静态int"计算" 并且如果每个人都完成它是0.(否则它是例如1或5,取决于有多少" sub" s尚未计算(例如,在加载新的原始数据之后)。)
好到目前为止一切都那么好,但是如果我想加速,用自己的子对象制作一个新的" top" -object会发生什么呢,那么它们都将具有相同的静态值( !)。当然我先测试一下。然后我试着制作" sub"私人课程" top" (只是一个新手的想法)。但是没有......,静态是静态的,它们都具有相同的值;)
我仍然有想法,比如让所有" sub"中的指针指向顶部的成员,然后让他们改变它。对于不同的上衣,这个指针会有所不同。
我怎么想知道是否有任何"官方"解决方案为不同的对象组(一个类)分配不同的静态值。
顺便说一句:如果通过pointerarithmetics子访问top的私有值会导致错误吗?
来自新手的问候
本尼
答案 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>