问题描述
|
考虑以下代码:
struct I
{
SomeInternalState m_internalState;
};
struct S
{
I * m_i;
set_I (I * i)
{
m_i = i;
makeSomeChangesToTheInternalStateOfI(m_i);
}
};
struct S_1 : S { ... };
struct S_2 : S { ... };
...
struct S_n : S { ... };
假定可以创建任意数量的S_1
,...S_n
实例,并且它们全部将仅调用set_I()
一次。
现在,我希望每个类型S_x
的每个I
实例的S_1
,... ...2ѭ到makeSomeChangesToTheInternalStateOfI()
实例一次,这样我就可以从相同类S_x
的不同实例和相同的I
实例中调用set_I()
,并确保ѭ7'的内部状态仅在第一次通话时才被修改。
可能的决定是将一些分配表放入ѭ7中,但我认为它不是一个明智的键,仅基于S_x
实例的类型并且不涉及任何手写的“运行时类型id”常量所有可能的类型S_1
,...S_n
。
我该怎么做?
编辑:
我应该强调的几点:
1)一次可能会有一个以上的ѭ7instance实例,并且S_x
类应该能够更改I
的多个实例的状态,但每个实例只能更改一次。那是:
I i1,i2;
S_1 s1a,s1b;
S_2 s2a,s2b;
// all possible combinations:
s1a.changeStateOfI(i1);
s1b.changeStateOfI(i1);
s2a.changeStateOfI(i1);
s2b.changeStateOfI(i1);
s1a.changeStateOfI(i2);
s1b.changeStateOfI(i2);
s2a.changeStateOfI(i2);
s2b.changeStateOfI(i2);
在此片段中,ѭ21和22的状态仅应通过ѭ1方法(通过ѭ24)更改一次,并通过by25'(通过'26ѭ)更改一次。
2)我想,可以使用引用计数来解决问题-无需确切知道初始化发生了多少次,就足以知道是否进行了初始化。
编辑2
我将n.m.的建议标记为答案,尽管我的最终解决方案有所不同。在这里,以便其他人也可以使用它:
struct AbstractS
{
I * m_i;
virtual void set_I (I * i) = 0;
};
template <typename self_T>
struct RegS : AbstractS
{
static std::set<I *> s_registeredContexts;
virtual void set_I (I * i)
{
m_i = i;
if (i == NULL || s_registeredContexts.count(i) > 0) return;
makeSomeChangesToTheInternalStateOfI(i);
contexts.insert(i);
}
};
template <typename self_T>
std::set<I *> InterpreterState<self_T>::s_registeredContexts;
struct S_1 : RegS<S_1> { ... };
struct S_2 : RegS<S_2> { ... };
...
struct S_n : RegS<S_n> { ... };
与n.m.的变体相比,差异在于我在这里使用了CRTP模式,而不是枚举实例化,这也是我想避免的事情。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)