線形リストを作ってみる その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]