Пример сегрегации интерфейса C ++ - PullRequest
0 голосов
/ 30 апреля 2018

Я искал веб-сайт oodesign для примера разделения интерфейса

Я понял пример и написал ниже код на C ++,

#include <iostream>

using namespace std;

class IWorkable {
public: 
    virtual void work() = 0;
};

class IFeedable{
public:
    virtual void eat() = 0;
};

// interface segregation principle - good example
class IWorker : public IFeedable, public IWorkable {
};

class Worker : public IWorkable, public IFeedable
{
public:
    void work() {
        cout << "working" <<endl;
    }

    void eat() {
        cout << "eating in launch break" <<endl;
    }
};

class SuperWorker : public IWorkable, public IFeedable{
public:
    void work() {
        cout << "working much more" << endl;
    }
    void eat() {
        cout << "eating in launch break" <<endl;
    }
};

class Robot :public IWorkable{
public:
    void work() {
        cout << "Robot working" <<endl;
    }
};

class Manager {
    IWorkable *worker;

public :
    void setWorker(IWorkable *w) {
        worker = w;
    }

    void manage() {
        worker->work();
    }
};

int main()
{
    IWorkable * w1 = new Worker();
    IWorkable * sw1 = new SuperWorker();
    IWorker *w2;
    Manager m1;
    m1.setWorker(w1);
    m1.manage();

    //When worker wants he can eat
    w2 = dynamic_cast<IWorker*>(w1);
    w2->eat();

    return 0;
}

Когда я запускаю вышеуказанный код, я получаю ошибку сегментации в w2->eat();

Я предполагаю, что код приводит только указатель IWorkable к IWorker, который не будет работать, потому что IWorkable не имеет eat метода.

Если так, каким было бы решение в этом случае? Любое предложение / указатель поможет.

Примечание : я пробую это в C ++ 98, однако я открыта для изучения нового пути в C ++ 11/14/17.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Ваш dynamic_cast равен return ing NULL, поскольку Worker не наследует IWorker. Используя наследство, я предполагаю, что вы шли, это работает правильно.

class Worker : public IWorker { /* your same implmenetations */ };
0 голосов
/ 30 апреля 2018

Вы получаете доступ к указателю w2, не назначая его. Поскольку значение указателя по умолчанию равно неопределенному значению, нет гарантии, что оно указывает на действительный объект. Смотри: https://en.wikipedia.org/wiki/Dangling_pointer#Cause_of_wild_pointers

...