C++ паттерн “стратегия”

223
31 марта 2018, 16:51

Попробовал, перепеписать код из книжки Head First про паттерны, на C++, но появляется ошибка E0322 object of abstract class type "MallardDuck" is not allowed: Duck d:\Code\CODE\C++\Duck\Duck\Source.cpp 119 т.е. компилятор не видит реализованный класс. #include "iostream" using namespace std;

class IFlyBehavior
{
public:
    virtual void fly() = 0;
};
class FlyWithWings : public IFlyBehavior
{
public:
    void fly() override
    {
        cout << "fly!";
    }
};
class FlyNoWay : public IFlyBehavior
{
public:
    void fly() override
    {
        cout << "no fly!";
    }
};
class IQuackBehavior
{
public:
    virtual void quack() = 0;
};
class Quack : public IQuackBehavior
{
public:
    void quack() override
    {
        cout << "Quack!";
    }
};
class Squeak : public IQuackBehavior
{
public:
    void quack() override
    {
        cout << "Squeak!";
    }
};
class MuteQuack : public IQuackBehavior
{
public:
    void quack() override
    {
        cout << "Can't quack";
    }
};
class Duck : public IFlyBehavior, IQuackBehavior
{
public:
    FlyWithWings* fly_behavior;
    Quack* quack_behavior;
    void swim()
    {
        cout << "Swim!";
    }
    virtual void display() = 0;
    void performQuack()
    {
        quack_behavior->quack();
    }
    void performFly()
    {
        fly_behavior->fly();
    }
};
class MallardDuck : public Duck
{
public:
    MallardDuck()
    {
        quack_behavior = new Quack();
        fly_behavior = new FlyWithWings();
    }
    void display() override
    {
        cout << "Mallard!";
    }
};
class RedheadDuck : public Duck
{
public:
    void display() override
    {
        cout << "RedHead!";
    }
};
class DecoyDuck : public Duck
{
public:
    void display() override
    {
        cout << "DecoyDuck!";
    }
};
class RubberDuck : Duck
{
public:
    void display() override
    {
        cout << "RubberDuck!";
    }
};

int main(int argc, char* argv[])
{
    Duck* md = new MallardDuck;
    md->performFly();
    md->performFly();
    return 0;
}
Answer 1

В MallardDuck не реализованы функции fly и quack. Они остались чисто виртуальными от базовых классов. Нужно эти реализации обеспечить.

На самом деле, просто вместо perform-функций надо использовать имена из интерфейсных классов и тогда всё будет ок:

void quack() override
{
    quack_behavior->quack();
}
void fly() override
{
    fly_behavior->fly();
}

Ну и в main поправить само собой. Тест

READ ALSO
указатель на массив символов

указатель на массив символов

В чем разница char arr[100] и char *arr1 = new char[100] и почему функция gets_s(char*) работает при gets_s(arr), но не работает gets_s(arr1)?

214
Не могу решить задачу по программе с++

Не могу решить задачу по программе с++

Найдите такое число x, что x^2+sqrt(x)=C , с точностью не менее 6 знаков после точки

197
React и JSP - можно ли использовать вместе?

React и JSP - можно ли использовать вместе?

Хочу подключить React в Spring-проект

166