1

对于在不同类层次结构中的两个类之间共享相同关键部分对象的问题,我很难找到正确的设计解决方案。

想象:

class IB;
class IA { 
    public: void method_one(); 
};
class A : public IA { 
    IB* m_ib; 
};

class IB { 
    public: void method_two(); 
};
class B : public IB { 
    IA* m_ia; 
};

现在,对 method_one() 和 method_two() 的调用应该是同步的。我碰巧使用critical_section 对象进行同步,但想知道我应该怎么做。

我设法弄清楚了一些想法:

  1. BADcritical_section m_cs; - 创建A 或 B 的合适成员 ( ),以及
    a) 从 IA 向下转换到 A(或分别从 IB 到 B),并使用它
    b) 使其成为静态,并调用A::m_cs(or B::m_cs)

  2. 更好- 创建额外的单例对象/结构来管理critical_section对象并提供对它的访问:

    class CriticalSectionProvider {
        //(...)
    public: 
        static critical_section& GetIt() { static critical_section cs; return cs; }
    }
    

不幸的是,我对这些都不满意,并认为有人可能有更好的主意。

在这种情况下,如何在两个类之间共享单个关键部分?

4

1 回答 1

2

最简单的方法是:critical_section在 main() 中创建一个实例,然后再创建要在它们之间共享对象的任何线程。

将其传递给类的构造函数并将其存储为参考

class A : public IA { 
    IB* m_ib; 
    critical_section & m_cs; //reference
    public:
           A(critical_section & cs) : m_cs(cs) {}
};

class B : public IB { 
    IA* m_ia; 
    critical_section & m_cs; //reference
    public:
           B(critical_section & cs) : m_cs(cs) {}
};

int main()
{
    critical_section cs = /*create it*/;

    A a = cs; //call the constructor, passing the reference
    B b = cs; //call the constructor, passing the reference
}
于 2011-04-17T20:23:23.810 回答