2012-09-27 3 views
0

Я разрабатываю код, используя модель модели Boss-Worker. Я сомневаюсь. Список, который будет добавлен Боссом, является членом класса Boss. Для того чтобы Рабочий получил доступ к нему, я наследую класс Worker от Boss.Дизайн модели Boss-Worker

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

работник наследует от Boss & ThreadClass потому что:

1) Работник необходим доступ к списку из Boss
2) работник должен резьб функции от ThreadClass

ответ

2

список которых Boss будет добавлять к, является членом класса Boss. Чтобы Рабочий получил доступ к нему, я наследую класс Worker от Boss.

Это категорически не хорошая причина один класс наследовать от другого. Обычно Worker должен наследовать от Boss тогда и только тогда, когда вы можете заменить Worker в любом месте, где вы могли бы использовать Boss. Концептуально это здесь не так.

Если вы хотите предоставить доступ к списку Boss «s из int затем, если Worker знает о Boss обеспечить и сбруя для него в Boss или (возможно) сделать Workerfriend из Boss.

Если вы не хотите Worker знать о Boss, но вместо того, чтобы иметь Boss знать о Worker сек затем сделать Boss передать список в Worker либо во время строительства или в подходящее время позже.

Предоставление доступа к чему-то не является основанием для того, чтобы один класс был получен из другого.

+0

У меня есть ваше мнение. Работник "не является" Боссом, чтобы унаследовать его. – cppcoder

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 
}; 
+0

Если запись выполняется только из 1 потока и нескольких потоков, считанных из списка, 'std :: list' будет достаточно? – cppcoder

+0

@cppcoder Я так не думаю, потому что чтения не являются атомарными. Вы можете читать местоположение одновременно с изменением другого потока. – juanchopanza