2012-09-27 30 views
0

我正在开发一个使用老板 - 工人模型模式的代码。我有个疑问。 Boss将添加到的列表是Boss类的成员。 为了让工作人员访问它,我使Worker类从Boss继承。老板 - 工人模型设计

1)这是正确的方式来分享老板&工人之间的名单吗?
2)我在我的代码中面临模棱两可的继承。我该如何解决它?

ThreadClass

#include <pthread.h> 
class ThreadClass 
{ 
public: 
    virtual int start(); 
    virtual void join(); 
    virtual void execute() = 0; //Each derived class will implement this 
    virtual ~ThreadClass() {} 
    ThreadClass() {} 
private: 
    ThreadClass* Tptr; 
}; 

首领

#include "ThreadClass.h" 
#include <list> 

class Boss : public virtual ThreadClass 
{ 
public: 
    virtual void execute(); 
    Boss() {} 
    ~Boss() {} 

protected: 
    std::list<int> Mylist; //To be shared with the worker 
}; 

工人

#include "ThreadClass.h" 
#include "Boss.h" 
class Worker : public Boss, public ThreadClass //Getting error:Ambiguous ThreadClass 
{ 
public: 
    virtual void execute(); 
    Worker() {} 
    ~Worker() {}  
}; 

工人从首领012继承个ThreadClass因为:

1)工人需要从老板
2访问列表)工人需要从ThreadClass

线程功能

回答

2

该首领将被添加到列表中,是BOSS类的成员。为了让工作人员访问它,我正在从Boss继承Worker类。

这断然不是一个很好的理由,一个类从另一个继承。通常,Worker应该从Boss继承,当且仅当您可以在任何可以使用Boss的地方替换Worker。从概念上讲,情况并非如此。

如果要提供访问的intBoss的名单,然后,如果Worker知道的Boss提供和Boss或访问它(可能)使WorkerBoss一个friend

如果你不想做Worker了解Boss而是有Boss了解Worker当时的制作Boss无论是在施工时或在合适的时间后,该列表传递给Worker

提供对某物的访问不是使一个类从另一个类派生出来的原因。

+0

我明白了你的观点。工人“不是”从他那里继承的老板。 – cppcoder

1

我将取消夫妇的所有类和青睐组成。 WorkerBoss都可以共享外部创建的列表,方法是持有对其的引用。关于线程功能,C++ 11和boost.thread方法是让线程类型采用“可调用”实体。我认为这种解耦方法比你提出的双重继承更清洁。

顺便说一句,您可能需要为此推出自己的并发列表类。如果不同的线程正在同时读取,至少有一个线程线程写入std::list将不安全。

class ConcurrentList { .... }; 
class Boss 
{ 
    ConcurrentList& list_; 
public: 
    Boss(ConcurrentList& l) : list_(l) 
    // other methods 
}; 
class Worker 
{ 
    ConcurrentList& list_; 

public: 
    Worker(ConcurrentList& l) : list_(l) 
    // other methods 
}; 
class Thread 
{ 
    // implement a call-cack mechanism 
}; 
+0

如果写操作只有一个线程和多个线程从列表中读取,那么'std :: list'就足够了吗? – cppcoder

+0

@cppcoder我不这么认为,因为读取不是原子的。您可能会在另一个线程修改它的同时读取一个位置。 – juanchopanza