はじめに
ブロック崩しとりあえず完成を目指す。でも今日はロベールするで。
ロベールのC++
クラスのテンプレート
関数のテンプレートは、 int型
double型
などの制限を受けずに関数に値を入れる事ができる。という便利な機能のことであった。
クラスのテンプレートは、どのような恩恵を受けることができるのであろうか?
とりあえず書いてみる。
Array.h
#ifndef ARRAY_H
#define ARRAY_H
#include <iostream>
#include <algorithm>
#include <cstdlib>
template <typename TYPE>
class Array {
public:
//引数付きコンストラクタ
Array( int size );
//コンストラクタ
Array( const Array& other );
//operator関数 = を定義
void operator = ( const Array& other );
//デストラクタ
virtual ~Array();
public:
TYPE Get( int i ) const;
void Set( int i, TYPE value );
public:
//配列のサイズを返す
int Size() const;
private:
//インデックスのチェック
void CheckIndex( int i ) const;
private:
//動的配列
TYPE* m_array;
//配列の要素数
int m_size;
};
template <typename TYPE>
Array<TYPE>::Array( int size )
{
m_array = new TYPE[ size ];
m_size = size;
}
template <typename TYPE>
Array<TYPE>::Array( const Array& other )
{
m_size = other.m_size;
m_array = new TYPE[ m_array ];
std::copy( other.m_array, other.m_array + m_size, m_array );
}
template <typename TYPE>
void Array<TYPE>::operator = ( const Array& other )
{
TYPE* array = new TYPE[ other.m_size ];
delete[] m_array;
m_size = other.m_size;
std::copy( other.m_array, other.m_array + m_size, m_array );
}
template <typename TYPE>
Array<TYPE>::~Array()
{
delete[] m_array;
}
template <typename TYPE>
TYPE Array<TYPE>::Get( int i ) const
{
CheckIndex( i );
return m_array[ i ];
}
template <typename TYPE>
void Array<TYPE>::Set( int i, TYPE value )
{
CheckIndex( i );
m_array[ i ] = value;
}
template <typename TYPE>
int Array<TYPE>::Size() const
{
return m_size;
}
template <typename TYPE>
void Array<TYPE>::CheckIndex( int i ) const
{
if( 0 <= i && i < m_size ){
//正常
}else{
std::cerr << "インデックスが不正" << std::endl
<< "値 : " << i << std::endl;
std::exit(EXIT_FAILURE);
}
}
#endif
classtemp.cpp
#include "Array.h"
#include <iostream>
int main() {
Array<int> array(5);
std::cout << array.Size() <<std::endl;
for(int i = 0, size = array.Size(); i < size; ++i ) {
array.Set(i, i * 2);
std::cout << "あああ" <<std::endl;
}
for(int i = 0, size = array.Size(); i < size; ++i ) {
std::cout << array.Get(i) << ' ';
}
std::cout << std::endl;
}
実行結果
エラーでないけどなにも出力されなかった。
どこかが間違ってるっぽい。また明日探す。
実際には↓のように表示される予定。
0 2 4 6 8
書いていて思ったのだが、 <array>
や <vector>
ってこうやって作られているのだなと思いました。
自分で、便利な機能を追加するためには、templete機能は必須だと感じた。
そういえば、ブロック崩しの Vector2Dクラス
のテンプレートを実装しようとしたが忘れていた。
明日時間がれば実装してみる。
終わりに
テンプレートってcppファイル書かないのね。