【C++】多次元ベクトルクラスを作る

公開日: : 最終更新日:2014/08/14 C/C++

スポンサーリンク

3次元ベクトルクラスや2次元ベクトルクラスを作るときは内部のデータとして静的な配列を使えば問題ありませんでした。

しかし、次元数が不確定な多次元ベクトルクラスを作るには動的に配列を確保する必要があるのですが、この辺はちょっと間違えるとメモリリークの原因となってしまいます。

具体的にはコピーコンストラクタ代入演算子のオーバーロードデストラクタをちゃんと定義する必要があります。

#include<stdio.h>
#include<string.h>
//多次元ベクトルクラス
class VectorClass
{
public:
	VectorClass(int length)
	{
		this->length=length;
		value = new double[ length ];
		memset(value,0,length*sizeof(double));
	}
	//コピーコンストラクタ
	VectorClass(const VectorClass& v)
	{
		length = v.length;
		value = new double[ length ];
		memcpy(value,v.value,length*sizeof(double));
	}
	//デストラクタ
	~VectorClass(void)
	{
		delete[] value;
		value = NULL;
	}
	void set(int index,double value)
	{
		this->value[ index ] = value;
	}
	double get(int index) const{ return value[ index ]; }
	int size(void) const{ return length; }
	//和をとる
	VectorClass operator+(const VectorClass& v) const
	{
		VectorClass dst(length);
		for(int i=0;i<length;i++){
			dst.value[i] = value[i]+v.value[i];
		}
		return dst;
	}
	//出力テスト
	void print(void) const
	{
		printf("(");
		for(int i=0;i<length;i++)
		{
			printf("%f",value[i]);
			if(i<length-1){ printf(","); }
		}
		printf(")\n");
	}
	//代入演算子オーバーロード
	VectorClass& operator=(const VectorClass& v)
	{
		delete[] value;
		length = v.length;
		value = new double[ length ];
		memcpy(value,v.value,length*sizeof(double));
		return *this;
	}
private:
	VectorClass(void){} //禁止しておく
	double *value;
	int length;
};
int main(void)
{
	int dim = 4;
	VectorClass v1(dim),v2(dim);
	for(int i=0;i<4;i++)
	{
		v1.set(i,i);
		v2.set(i,i*2);
	}
	VectorClass dst = v1 + v2;
	v1.print();
	v2.print();
	dst.print();
}
(0.000000,1.000000,2.000000,3.000000)
(0.000000,2.000000,4.000000,6.000000)

上の例では和をとるだけの関数しか用意していませんが、コピーコンストラクタ、代入演算子のオーバーロード、デストラクタ内では配列のコピーや解放などを行っています。
また、memsetは配列の初期化、memcpyは配列のコピーを行います。

代入演算子のオーバーロードで自分自身の参照(VectorClass&)を返しているのは

VectorClass v1(4),v2(4),v3(4);
~~
v1 = v2 = v3;

のように連続して代入できるようにするためです。別にvoidとかにしてもこういう使い方をしなければ動きます。

なお、この例では型をdoubleとしましたが、実際はテンプレートを使った方が型を後から定義できて便利ですのでそちらをお勧めします。

スポンサーリンク
Amazon
  • このエントリーをはてなブックマークに追加

関連記事

CSS85_keywosousasruop20131019500-thumb-500xauto-4249

【C言語/C++】配列をシャッフルしてランダムに入れ替える

C言語・C++で配列をシャッフルする方法 Fisher–Yatesシャッフルアルゴルズムにより配列

記事を読む

Window Command Line

【C言語/C++】関数の宣言・定義まとめ

1 関数プロトタイプ宣言・定義 1-1 プロトタイプ宣言 1-2 定義 2 ファイ

記事を読む

PAK23_husentomemo20140313500-thumb-500xauto-4376

【C言語】printfのような関数を作る

C言語でよくつかわれるprintfでは例えば int a,b,c; … printf(

記事を読む

フォルダ画像

【C言語/C++】フォルダ作成を行う

C言語、C++でフォルダを作成するには『direct.h』にある『_mkdir』関数を使うことで実現

記事を読む

PAK86_codeing20140517500-thumb-500xauto-4601

【C言語/C++】余りを求める剰余演算子(%)を使う

基本的なことかもしれませんが、C言語やC++などであまりを出すには剰余演算子である『%』を使います。

記事を読む

CSSS85_MBAwonozokujyosei20131019500-thumb-500xauto-4044

【C++】vectorの解放

C++STLにあるvectorは配列の要素数がわからない場合などに非常に便利ですがメモリ関係で面倒だ

記事を読む

PAK86_codeing20140517500-thumb-500xauto-4601

【C言語/C++】int整数などの数値をchar配列の文字列に変換する

C++であればstringが使えて非常に便利ですが、C言語で文字列というと基本的にはcharの配列を

記事を読む

childish_File

【C言語】fopenが失敗するエラー

ファイル操作に使うfopenがどうしても失敗してしまい困っていました。既に開かれているファイルを開く

記事を読む

PAK86_codeing20140517500-thumb-500xauto-4601

【C言語/C++】配列のまとめ

C/C++を使っていると必ず配列を使う場面が出てくると思いますが、その配列についてまとめました。C言

記事を読む

LIG_h_dartssurudansei500-thumb-500xauto-3336

OpenCVで矢印を描画する

OpenCVで矢印を描画するという関数が無いみたいだったので作りました。書いていることは参考リンク先

記事を読む

encodingtype
【PHP】headerでContent-Typeを指定したのに効かない場合の対処法

PHPでサイトマップを作ろうと思い、XML形式のファイルを出力しようと

_rtm0919_tp_v
スマホ向け幅固定サイトの回転時の幅対応方法

幅固定サイトでのスマホ回転時Webサイトの横幅を合わせる方法のメモ。

rssimage
【PHP】特定のURLからそのAtomやRSSのフィードを抽出する方法

特定のURLからRSSやATOMのフィードを抽出する方法をメモ。 流

rssimage
フィード抽出ツール(RSS1.0、RSS2.0、atom)

任意URL サイト名 サイトURL RSS1.0

computer_server
格安プラン限定レンタルサーバー機能比較表(2016年)

はじめに  最近新しい共用サーバーをレンタルしようと思い調査およびそ

school_toshokan_hondana
kindle unlimitedが便利だったのでお勧めの使い方など感想メモ

 kindle unlimitedというサービスが8/3からAmazo

TAKEBE055122558_TP_V
寝る前にスマホを見ると斜視になる可能性とその対策

はじめに  寝る前などスマホを横になりながら見続けると斜視になる可能

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑