線形リストを作ってみる その4 〜色リスト遊び
リストの中にクラスのインスタンスを入れてみます。
線形リストをウインドウに表示させることを想定して、それぞれのノードに位置と色の情報を保持させてみます。
位置情報は、C++でベクトルクラスを作成する〜その1 - white wheelsのメモで作成したVector2Dクラスを使います。
前回の修正点:ノードにインスタンスを入れるのでコンストラクタの初期化部分を除去。
Node.h&Node.cpp
TEMPLATE Node<Type>::Node(void): m_next(0), m_prev(0)/*, m_data(0)*///型が合わない { }
コンソールに表示するためのテスト用メソッドを追加。
void printObj();//メンバ変数を出力する(テスト用) TEMPLATE void Node<Type>::printObj(){ cout <<"prev["<<m_prev<<"]\t"; cout <<"["<<this<<",data="; m_data.print(); cout<<"]\t"; cout <<"next["<<m_next<<"]"; }
リストクラスにも表示用メンバ関数を追加します。
List.h & List.cpp
void printObj(); //要素を表示する TEMPLATE void List<Type>::printObj(){ cout <<"(root) "<<"\t\t"; m_root->printObj(); cout<<endl; int count=0; for(Node<Type>* node=m_root->next();node!=m_root;node=node->next()){ cout <<"(node"<<count<<") "<<"\t"; node->printObj(); cout<<endl; count++; } }
色クラスの作成
メンバ変数はr(赤),g(緑),b(青):unsigned char型。色を計算するには、シフト演算を利用。
r <<16 | g <<8 | b;
色の情報で利用する型の定義はWindowsで定義されているものを拝借。
unsigned long 符号なし長整数型 WIN32SDKではDWORD型という定義 32bit 0〜4294967295
↓
Color.h
#ifndef __COLOR_H #define __COLOR_H typedef unsigned long DWORD; class Color { public: Color(int _r,int _g,int _b); Color(); DWORD getColor(); void print(); #テスト用 int r; int g; int b; private: #define BLACK Color(0,0,0) #define WHITE Color(255,255,255) #define CYAN Color(0,255,255) #define YELLOW Color(255,255,0) #define MAGENTA Color(255,0,255) #define RED Color(255,0,0) #define GREEN Color(0,255,0) #define BLUE Color(0,0,255) #define GRAY Color(127,127,127) }; #endif
Color.cpp
#include "Color.h" Color::Color(int _r,int _g,int _b): r(_r),g(_g),b(_b) { } Color::Color(): r(0),g(0),b(0) { } #include <iostream> using namespace std; DWORD Color::getColor(){ return r <<16 | g <<8 | b; } void Color::print(){ cout<< "("<< r <<"," << g <<"," <<b <<")"; }
色とベクトルクラスを合体させる
取り出しやすいので、全てpublicなclass(struct)にしてみます。
↓Particle.h&Particle.cpp
#include "Color.h" #include "Vector2D.h" class Particle{ public: Particle(){ this->color=Color::BLACK; this->vector.x=0; this->vector.y=0; } Particle(Color aColor,Vector2D aVector){ this->color = aColor; this->vector = aVector; } Color color; Vector2D vector; void print(); }; #include <iostream> using namespace std; void Particle::print(){ color.print(); cout <<vector; }
色&ベクトルリストを使ってみる
#include <iostream> using namespace std; void Particle::print(){ color.print(); cout <<vector; } int main(){ List<Particle> ParticleList; const Particle myParticle=Particle(); myParticle.color=Color::RED; ParticleList.push_back(myParticle); ParticleList.push_back(Particle(Color::GREEN,Vector2D(10.0f,20.0f))); ParticleList.push_back(Particle(Color::YELLOW,Vector2D(10.0f,20.0f))); ParticleList.printObj(); cout << endl; return 0; }
(root) prev[007309F8] [00730920,data=(0,0,0)(0,0)] next[00730968]
(node0) prev[00730920] [00730968,data=(255,0,0)(0,0)] next[007309B0]
(node1) prev[00730968] [007309B0,data=(0,255,0)(10,20)] next[007309F8]
(node2) prev[007309B0] [007309F8,data=(255,255,0)(10,20)] next[00730920]