スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++でAS3のArrayみたいな配列を実装する

ActionScript3.0(Flashのスクリプト言語)の、Array配列が、とても便利なのですよ。

普通の配列と違って、子要素をいくらでも連結できるんです。mapみたいな文字列でデータ取得できますし。

var a : Array = new Array();
a["a"] = new Array();
a["a"]["b"] = new Array();
a["a"]["c"] = 1;
a["a"]["b"]["d"] = 2;
a["a"]["b"]["e"] = 3;

こんな感じです。
この配列はJSONやXMLなどの、ツリー構造のデータと大変相性がいいんです。
デバッグしやすいし、データ構造も分かりやすいです。


C++でもvoidポインタ使って、配列をいくらでも作れますが、仕様変更や流用の多いゲーム制作では、ポインタの使用は最小限にしたいところ。あと、*void元に戻すのが面倒だしデバッグがしにくくなります。

というわけで、ActionScriptみたいな配列クラスをC++で作ってみました。

これなら、ゲームのデータも独自クラスを持たないで、この配列で一元管理できるかもしれません。


///////////Asray.h

#pragma once

#include
#include
#include
#include
#include

class ASRAY{
public :

std::string text;

//JSON_TREE *child;
std::map< std::string, std::vector< ASRAY > > child;

ASRAY();

ASRAY( std:: string str ){
text = str.c_str();
}

void addChild( std::string key, std::string value ){
child[key].push_back( value );
}
std::vector< ASRAY > getChild( std::string key ){
return child[key];
}

//std::map< std::string, std::vector< ASRAY > > copyChild( std::map< std::string, std::vector< ASRAY > > swap_child ){
void copyChild( std::map< std::string, std::vector< ASRAY > > swap_child ){
child.clear();
//if( swap_child.size() > 0 ){
for( std::map< std::string, std::vector< ASRAY > >::iterator ite_map = swap_child.begin(); ite_map != swap_child.end(); ite_map++ ){

std::vector< ASRAY > new_vec;
child.insert( std::make_pair( ite_map->first, new_vec ) );

for( std::vector< ASRAY >::iterator ite_vec = ite_map->second.begin(); ite_vec != ite_map->second.end(); ite_vec++ ){

ASRAY new_array( ite_vec->text );
new_array.copyChild( ite_vec->child );
child[ite_map->first].push_back( new_array );

}

}

}

//オペレーターボイス
std::vector< ASRAY > operator[]( std::string key ){
return getChild(key);
}
void operator = ( std::string str ){
text = str.c_str();
}
void operator = ( ASRAY asr ){
text = asr.text.c_str();
copyChild( asr.child );
}
};


///////////test.cpp


#include "Asray.h"
#include "JsonMng.h"


JsonMng::JsonMng(void){

}

JsonMng::~JsonMng(void){
}

std::string JsonMng::test( ){

std::string str = "あ";

ASRAY tree( "test" );

tree.addChild( "hello", "world!" );
tree.addChild( "good", "evening!" );
tree.addChild( "good", "night!" );

ASRAY tree2( "test2" );

//tree2.copyChild( tree.child );
tree2 = tree;
tree.child.clear();

std::cout << tree2.text << std::endl;
std::cout << tree2[ "hello" ][0].text << std::endl;
std::cout << tree2.getChild( "good" ).at(0).text << std::endl;
std::cout << tree2.getChild( "good" ).at(1).text << std::endl;


return str;
}
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

シウチ 

Author:シウチ 
仕事でゲームとか作ってます。
趣味でもゲーム作ってます。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
ブログランキング
ブロとも一覧

不可思議☆音楽倉庫

RESPITEのゲーム製作日記

笹の葉を食う頃に礼
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。