Проблема с созданием простого фабричного метод, C++

Изучая ООП попытался реализовать фабричный метод.

Описание: В этом примере Фабричный метод помогает создавать кросс-платформенные элементы интерфейса, не привязывая основной код программы к конкретным классам элементов. Фабричный метод объявлен в классе диалогов. Его подклассы относятся к различным операционным системам. Благодаря фабричному методу, вам не нужно переписывать логику диалогов под каждую систему. Подклассы могут наследовать почти весь код из базового диалога, изменяя типы кнопок и других элементов, из которых базовый код строит окна графического пользовательского интерфейса.

Моя неудачная попытка реализации:

#include <iostream>
#include <string>

using namespace std;

class Button
{
public:
    virtual void render();
    virtual void onClick(string action);
};

class WindowsButton : public Button
{
public:
    void render() override
    {
        cout << "Windows button rendering..." << endl;
    }

    void onClick(string action) override
    {
        cout << "> Windows button onClick event!" << endl;
        cout << action << endl;
    }
};

class HtmlButton : public Button
{
public:
    void render() override
    {
        cout << "Html button rendering..." << endl;
    }

    void onClick(string action) override
    {
        cout << "> Html button onClick event!" << endl;
        cout << action << endl;
    }
};

class Dialog
{

public:
    void render()
    {
        Button okButton = this->createButton();
        okButton.onClick("Close Dialog");
        okButton.render();
    }

    virtual Button createButton();
};

class WindowsDialog : public Dialog
{
public:
    Button createButton() override
    {
        WindowsButton winButton;
        return winButton;
    }
};

class HtmlDialog : public Dialog
{
public:
    Button createButton() override
    {
        HtmlButton htmlButton;
        return htmlButton;
    }
};

int main() {
    int osType = 0; // 0 - Windows, 1 - Web
    Dialog dialog;
    if (osType == 0)
    {
        dialog = WindowsDialog();
    }
    else if (osType == 1)
    {
        dialog = HtmlDialog();
    };

    dialog.render();

}

Полученные ошибки:

введите сюда описание изображения

Где я ошибся?


Ответы (1 шт):

Автор решения: magrif

Прочтите про полиморфизм, и на основе полученных знаний сравните свой текущий код с рабочим:

#include <iostream>
#include <string>

using namespace std;

class Button
{
public:
    virtual void render() = 0;
    virtual void onClick(string action) = 0;
};

class WindowsButton : public Button
{
public:
    void render() override
    {
        cout << "Windows button rendering..." << endl;
    }

    void onClick(string action) override
    {
        cout << "> Windows button onClick event!" << endl;
        cout << action << endl;
    }
};

class HtmlButton : public Button
{
public:
    void render() override
    {
        cout << "Html button rendering..." << endl;
    }

    void onClick(string action) override
    {
        cout << "> Html button onClick event!" << endl;
        cout << action << endl;
    }
};

class Dialog
{

public:
    void render()
    {
        Button* okButton = this->createButton();
        okButton->onClick("Close Dialog");
        okButton->render();
    }

    virtual Button* createButton() = 0;
};

class WindowsDialog : public Dialog
{
public:
    Button* createButton() override
    {
        return new WindowsButton;
    }
};

class HtmlDialog : public Dialog
{
public:
    Button* createButton() override
    {
        return new HtmlButton;
    }
};

int main() {
    int osType = 1; // 0 - Windows, 1 - Web
    Dialog* dialog;
    if (osType == 0)
    {
        dialog = new WindowsDialog();
    }
    else if (osType == 1)
    {
        dialog = new HtmlDialog();
    };

    dialog->render();
}
→ Ссылка