とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

STLとオブジェクト指向プログラミングの結合 ex17-01.cpp

STL―標準テンプレートライブラリによるC++プログラミング 第2版
ex17-01.cpp, shape.hpp, screen.hpp の三つのファイルを用いたプログラム。

// P257 ex17-01.cpp
#include<functional>
#include<vector>
#include<iostream>
#include<algorithm>
#include"shape.hpp"

class myshape
 : public rectangle
{
 line* l_eye;
 line* r_eye;
 line* mouth;
public:
 myshape(point a, point b)
  : rectangle(a, b)
 {
  int ll = neast().x - swest().x + 1;
  int hh = neast().y - swest().y + 1;
  l_eye = new line(point(swest().x + 2, swest().y + hh * 3 / 4), 2);
  r_eye = new line(point(swest().x + ll - 4, swest().y + hh * 3 / 4), 2);
  mouth = new line(point(swest().x + 2, swest().y + hh / 4), ll - 4);
 }
 void draw()
 {
  rectangle::draw();
  const int a = (swest().x + neast().x) / 2;
  const int b = (swest().y + neast().y) / 2;
  put_point(point(a, b));
 }
 void move(int a, int b)
 {
  rectangle::move(a, b);
  l_eye->move(a, b);
  r_eye->move(a, b);
  mouth->move(a, b);
 }
};

struct CompWestX
 : std::binary_function<shape*, shape*, bool>
{
 bool operator()(shape* p, shape* q)const
 {
  return p->west().x < q->west().x; // 多態
 }
};

void outputWestX(const std::vector<shape*>& vs)
{
 using std::vector;
 using std::cout;
 using std::endl;
 for(vector<shape*>::const_iterator i = vs.begin(), end = vs.end();
     i != end; ++i)
 {
  cout << "The x-coordinate of the west point of shape "
   << i - vs.begin() << " is " << (*i)->west().x << endl;
 }
}

int main()
{
 // screen & shape のテスト
 screen_init();
 shape* p1 = new rectangle(point(), point(10, 10));
 shape* p2 = new line(point(0, 15), 17);
 shape* p3 = new myshape(point(15, 10), point(27, 18));
 shape_refresh();
 
 p3->move(-10, -10);
 shape_refresh();
 stack(p2, p3);
 shape_refresh();
 stack(p1, p2);
 shape_refresh();

 // STL + 多態 part 1
 using std::vector;
 using std::cout;
 using std::endl;
 using std::sort;
 vector<shape*> vs;
 vs.push_back(p1);
 vs.push_back(p2);
 vs.push_back(p3);
 for(vector<shape*>::const_iterator i = vs.begin(), end = vs.end();
     i != end; ++i)
 {
  (*i)->move(20, 0); // 多態なmove
 }
 shape_refresh();

 // STL + 多態 part 2
 outputWestX(vs);
 cout << "Sorting the shapes according to the "
  "x-coordinate of their west points." << endl;
 sort(vs.begin(), vs.end(), CompWestX()); // 多態なsort (CompWestX()により)
 cout << "After sorting:" << endl;
 outputWestX(vs);

 screen_destroy();
}