LoginSignup
1
0

More than 3 years have passed since last update.

はじめてのC++ 【46日目】

Posted at

はじめに

ブロック崩しとりあえず完成を目指す。でも今日はロベールするで。

ロベールの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ファイル書かないのね。

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0