0

我正在使用 Boss-Worker 模型模式开发代码。我有个疑问。Boss 将添加到的列表是 Boss 类的成员。为了让 Worker 能够访问它,我让 Worker 类继承自 Boss。

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) Worker 需要访问 Boss 的列表
2) Worker 需要 ThreadClass 的线程函数

4

2 回答 2

2

Boss 将添加到的列表是 Boss 类的成员。为了让 Worker 能够访问它,我让 Worker 类继承自 Boss。

这绝对不是一个类从另一个类继承的好理由。通常,当且仅当您可以在可以使用 a 的任何地方替换 a 时,才Worker应该继承自。从概念上讲,这里不是这种情况。BossWorkerBoss

如果您想提供对 thenBoss的列表的访问权限int,如果Worker知道Boss它的提供者和访问者,Boss或者(可能)制作Worker一个friendof Boss

如果您不想Worker知道Boss但对s有所Boss了解,请在构建时或稍后的合适时间将列表传递给s。WorkerBossWorker

提供对某物的访问并不是让一个类从另一个类派生的理由。

于 2012-09-27T06:40:45.877 回答
1

我会解耦所有的类并支持组合。两者都Worker可以Boss通过持有对它的引用来共享外部创建的列表。关于线程功能,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
};
于 2012-09-27T06:05:10.420 回答