基于类的类型的引用计数实例

问题描述

| 考虑以下代码:
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 (将#修改为@)