[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ども・・・・・・・・・・・・和佐田雅史です。
今回はイテレータについてです。
イテレータと言うのは反復子の事で、listやmapコンテナをfor文でポインタによる参照( のようなもの )を行いたい時に使います。
std::list< T >::iterator it = List.begin();
と言う感じですね。
しかし、自分でコンテナを作った時にiteratorはどう作ればよいでしょうか?
基本的には定義したコンテナクラスの中にローカルクラスとして定義するのが一般的です。
template< class T > class Freelist
{
// 実装
// ローカルクラスとして定義
class iterator : public std::iterator<.....>
};
ですが一々コンテナを作る時に定義するのははっきり言ってめんどくさいのでtemplateで作っておくと便利です。
//============================================
// コンテナ作成時の反復子
//
//
//
//============================================
#ifndef _ITERATOR_HPP_
#define _ITERATOR_HPP_
#include <iterator>
namespace Alumina
{
// friendの為の仮定義
template< typename Type , typename value_type > class iterator;
template< typename Type , typename value_type > class const_iterator;
//=============================================
// 通常iterator
//
//
//=============================================
template< typename Type , typename value_type > class iterator : public std::iterator<std::bidirectional_iterator_tag, value_type, void>
{
public:
iterator() : _ptr(0) {}
iterator(Type* ptr) : _ptr(ptr){}
// ジェネリック要素へのアクセス
Type& operator*() const {return *_ptr;}
Type* operator->() const {return _ptr;}
// 真偽判定
bool operator==(const iterator& rhs) const {return _ptr == rhs._ptr;}
bool operator!=(const iterator& rhs) const {return _ptr != rhs._ptr;}
//=============================================
//
// 演算子によるポインタ演算
//
//=============================================
iterator& operator++() {_ptr = _ptr->_next; return *this;}
iterator& operator--() {_ptr = _ptr->_prev; return *this;}
iterator operator++(int i) { iterator temp = *this; ++*this; return temp; }
iterator operator--(int i) { iterator temp = *this; --*this; return temp; }
protected:
// メンバ
Type* _ptr;
friend class Type;
friend class const_iterator;
};
//===============================================
// const_iterator
//
//
//===============================================
template< typename Type , typename value_type > class const_iterator : public std::iterator<std::bidirectional_iterator_tag, value_type, void>
{
public:
const_iterator() : _ptr(0){}
const_iterator(const iterator& it) : _ptr(it._ptr) {}
const_iterator(const Type* ptr) : _ptr(ptr) {}
const Type& operator*() const {return *_ptr;}
const Type* operator->() const {return _ptr;}
bool operator==(const const_iterator& rhs) const {return _ptr == rhs._ptr;}
bool operator!=(const const_iterator& rhs) const {return _ptr != rhs._ptr;}
//=============================================
//
// 演算子によるポインタ演算
//
//=============================================
const_iterator& operator++() {_ptr = _ptr->_next; return *this;}
const_iterator& operator--() {_ptr = _ptr->_prev; return *this;}
const_iterator operator++(int i) { const_iterator temp = *this; ++*this; return temp; }
const_iterator operator--(int i) { const_iterator temp = *this; --*this; return temp; }
protected:
const Type* _ptr;
friend class Type;
};
}
#endif
長くなりましたが、使用例を以下に示します。
// LISTNODE 型を管理するリストコンテナ
template < typename LISTNODE , template< class > class Interfase = ListType > class FreeList
{
public:
// 実装インターフェース設定
typedef Interfase< LISTNODE > LIST;
// それに伴った反復子を定義
typedef Alumina::iterator< LIST , LIST > iterator;
typedef Alumina::const_iterator< LIST , LIST > const_iterator;
.........................
};
このように定義するだけでiteratorが使えるようになります。
便利ですね。
それではお疲れ様でした。
ども、こんばんわ~
久しぶりに登場のZAKIです
学校ではラボにちょこちょこ出現していますけどねw
製作もそろそろ終盤
完成に向けてラストスパートをかけているころじゃないでしょうか
今年の2年生の作品は完成度が高いのが多そうなので楽しみです
寒いですが、風引かないように体調には気をつけましょうね
さて、今回は「C++でクラスの不思議」です。
まず、このコードを見てください。
#include <stdio.h>
//インターフェイスA
class A {
public:
virtual void MesA() = 0;
};
//インターフェイスB
class B {
public:
virtual void MesB() = 0;
};
//実装クラスC
class C : public A , public B {
public:
void MesA() { printf("Aのメソッドです。\n"); }
void MesB() { printf("Bのメソッドです。\n"); }
};
//メイン関数
int main()
{
C c;
void * pVoid = NULL;
B * pB = NULL;
pVoid = (void *)&c;
//普通にキャストした場合
pB = (B *)&c;
pB->MesB();
//void *を通してキャストした場合
pB = (B *)pVoid;
pB->MesB();
return 0;
}
さぁ、このコードを実行したとき、どういう結果が出るでしょうか?
「あれ?」と思うような結果になりませんか?
ども・・・・・・・・・・・・・・・GES会長の和佐田雅史です。
今日はいつものようにJUNK堂へ行っていましたが、新しい書籍が出ていたので紹介しておきます。
「GLUTによるOpenGL入門2 テクスチャマッピング」
遂にOpenGL Shader Languageの書籍が日本でも出ました。
同じシリーズの奴を一年次読んでましたが、今回のも中々に良書だと思います。
前半は環境マップ、放線マッピング、ShadowMap、バンプマップ等を固定機能のみで実装するやり方等が乗っています。
どれも代表的で非常に魅力的なEffectばかりです。
計算式なども乗ってますし、プログラムに直すとどうなるかもきちんと記述されています。
Shaderを使いたくない人はこちらでも充分でしょう。
後編はOpenGL Shader Language( 以下GLSL )を利用したプログラムです。
GLSLの基本的な記述の仕方から前半の内容をGLSLで記述したもの、視差マッピング( パララクスマッピング等とも呼ばれています )やトーンマッピング等も載ってます。
値段は2500円とかなりお買い得です。
OpenGLでゲームを開発する方は一見の価値ありだと思います。
それでは以上で書籍の紹介を終わります。
お疲れ様でした。
みんな書いているので便乗して。
こんにちは、文月浩加です。
年末をだらけて過ごしました…。
年賀状も昨日出すという冒涜…。
出した相手には多分、よくて、三が日。悪ければもっと遅いと思います…。
今年はホールスタッフでてんやわんやでしたね…。
ほんとーに怒られながらも頑張りました。
個人的にほんとーにいろんなことがありました。
でも、いい年でした。
来年はどんな年になるのやら。
とりあえず、最後の大仕事、Digital Worksが待ち受けております…。
GESスタッフの皆さんにも遠慮なくてつだっていただこうと思ってますので
どうぞよろしく。
というわけで、あと12時間切りましたが
皆さんはどう過ごすのかな?
皆さんZAKIさんのアンケートにも答えてくださいね~。
では、良いお年をっ!
浩加でした。