2012-09-27 55 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