0

Boss-Worker モデル パターンを使用してコードを開発しています。私は疑問を持っています。ボスが追加するリストは、ボス クラスのメンバーです。Worker がアクセスできるように、Boss から Worker クラスを継承させています。

1) これはボスとワーカーの間でリストを共有する正しい方法ですか?
2) コードであいまいな継承に直面しています。どうすれば解決できますか?

スレッドクラス

#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() {}    
};

Worker は Boss & ThreadClass から継承しています。理由は次のとおりです。

1) ワーカーは Boss からリストにアクセスする必要があります
2) ワーカーは ThreadClass からのスレッド関数を必要とします

4

2 に答える 2

2

ボスが追加するリストは、ボス クラスのメンバーです。Worker がアクセスできるように、Boss から Worker クラスを継承させています。

これは、あるクラスが別のクラスを継承する正当な理由とは言えません。通常、 aを使用できる任意の場所でa を置き換えることができる場合にのみ、Workerから継承する必要があります。概念的には、ここではそうではありません。BossWorkerBoss

Bossの のリストへのアクセスを提供したいint場合、が の提供とアクセサをWorker知っている場合、または (おそらく) の を作成します。BossBossWorkerfriendBoss

Workers について知りたくないBossがsBossについて知っている場合は、作成時または後で適切な時間にリストを に渡します。WorkerBossWorker

何かへのアクセスを提供することは、あるクラスを別のクラスから派生させる理由にはなりません。

于 2012-09-27T06:40:45.877 に答える
1

私はすべてのクラスを分離し、構成を優先します。Workerとの両方Bossが、外部で作成されたリストへの参照を保持することで、そのリストを共有できます。スレッド機能に関して、C++11 と boost.thread のアプローチでは、「呼び出し可能な」エンティティを受け取るスレッド タイプを使用します。この分離されたアプローチは、あなたが提案する二重継承よりもクリーンだと思います。

ところで、これには独自の並行リスト クラスをロールアウトする必要がある場合があります。std::list異なるスレッドが同時に読み取りを行っている場合、少なくとも 1 つのスレッドスレッドからの書き込みに対して安全ではありません。

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
};
于 2012-09-27T06:05:10.420 に答える