info

静的言語らしく基底クラスを作る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;
}