0

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

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

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

#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 &lt;&lt; &quot;&gt; Windows button onClick event!&quot; &lt;&lt; endl;
    cout &lt;&lt; action &lt;&lt; endl;
}

};

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

void onClick(string action) override
{
    cout &lt;&lt; &quot;&gt; Html button onClick event!&quot; &lt;&lt; endl;
    cout &lt;&lt; action &lt;&lt; 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();

}

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

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

Где я ошибся?

insolor
  • 49,104
  • Ниже человек дал верный ответ. Я дам подсказку: у вас не определены некоторые методы. Прототипы функций объявлены, а определения нет. Если вы хотите только объявить функцию, то ее нужно сделать чистой виртуальной. Тогда наследник-класс обязан будет ее определить. Но так или иначе определение должно быть. – ComeInRage Jun 29 '21 at 21:39
  • 1
  • 1
    текстовую информацию лучше прилагать в виде текста: а) читать легче; б) можно копировать; в) поиск работает. исправить текст вопроса можно, нажав [edit] ниже текста вопроса – aleksandr barakin Jun 30 '21 at 20:07

1 Answers1

3

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

#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 &lt;&lt; &quot;&gt; Windows button onClick event!&quot; &lt;&lt; endl;
    cout &lt;&lt; action &lt;&lt; endl;
}

};

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

void onClick(string action) override
{
    cout &lt;&lt; &quot;&gt; Html button onClick event!&quot; &lt;&lt; endl;
    cout &lt;&lt; action &lt;&lt; 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-&gt;render();

}

magrif
  • 2,789