静的言語らしく基底クラスを作るStrategyパターン
-Weffc++したらすごい警告出た、あばばばば #pragma onceは甘え
プロトタイプ宣言とか型指定する時classって明示しなきゃコンパイル通らなかった、どこがおかしいかわからん
Report.hpp
#pragma once #include <string> #include <vector> #include "Formatters.hpp" using namespace std; class Report { public: Report (class Formatter*); void output_report (void); string title; vector<string> text; private: Formatter *formatter; };
Report.cpp
#include <string> #include <vector> #include "Report.hpp" #include "Formatters.hpp" Report::Report (Formatter *informatter) { title = "月次報告"; text.push_back ("順調"); text.push_back ("最高の調子"); formatter = informatter; } void Report::output_report () { formatter->output_report (this); }
Formatters.hpp
#pragma once #include "Report.hpp" class Formatter { public: virtual void output_report (class Report*) = 0; }; class HTMLFormatter : public Formatter { public: void output_report (class Report*); }; class PlainTextFormatter : public Formatter { public: void output_report (class Report*); };
Formatters.cpp
#include "Report.hpp" #include "Formatters.hpp" #include <iostream> #include <string> #include <vector> using namespace std; void PlainTextFormatter::output_report (Report *context) { cout << "*** " + context->title + " ***" << endl; for (vector<string>::iterator line = context->text.begin (); line != context->text.end (); ++line) { cout << *line << endl; } } void HTMLFormatter::output_report (Report *context) { cout << "<html>" << endl; cout << " <head>" << endl; cout << " <title>" + context->title + "</title>" << endl; cout << " </head>" << endl; cout << " <body>" << endl; for (vector<string>::iterator line = context->text.begin (); line != context->text.end (); ++line) { cout << " <p>" + *line + "</p>" << endl; } cout << " </body>" << endl; cout << "</html>" << endl; }
stra.cpp
#include "Formatters.hpp" #include "Report.hpp" int main (int args, char *argv[]) { Report *htmlreport = new Report ((Formatter*)new HTMLFormatter ()); Report *textreport = new Report ((Formatter*)new PlainTextFormatter ()); #ifdef HTML htmlreport->output_report (); #endif /*HTML*/ #ifdef TEXT textreport->output_report (); #endif /*TEXT*/ delete htmlreport; delete textreport; }