我正在使用Boss-Worker模型模式开发代码。我有个疑问。 Boss将添加的列表是Boss类的成员。 为了让Worker访问它,我使Worker类继承自Boss。
1)这是在Boss&和Boss之间分享列表的正确方法吗?工人?
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() {}
};
工人继承自Boss&amp; ThreadClass因为:
1)工人需要访问Boss中的列表 2)Worker需要ThreadClass中的线程函数
答案 0 :(得分:2)
Boss将添加的列表是Boss类的成员。为了让Worker访问它,我使Worker类继承自Boss。
这绝对是不一个类从另一个类继承的好理由。通常,Worker
应该从Boss
继承,当且仅当您可以在任何可以使用Worker
的地方替换Boss
时。从概念上讲,这不是这种情况。
如果您希望提供对Boss
int
列表的访问权限,那么,如果Worker
知道Boss
提供Boss
的{{1}}或者(可能)使Worker
成为friend
的{{1}}。
如果您不希望Boss
了解Worker
,而是让Boss
知道Boss
s,那么请Worker
将列表传递给Boss
在施工时或在适当的时间之后。{/ p>
提供对某事物的访问并不是使一个类派生自另一个类的原因。
答案 1 :(得分: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
};