1

クラスへの不明なデータの保存に関する問題

任意の型の任意の数の変数を格納できるクラスを C++ で提供するにはどうすればよいですか? クラスの内外から、これらのデータを読み取り、追加、変更、および削除したいと思います。

だから私が探しているのは、おそらくデータ型が異なる可能性のあるリストです。

使用法がどのように見えるかの例

Class Object();
Object->Storage->Create("position", "float");    // create
Object->Storage->Write("position", 42.0f);       // write
int Result = Object->Storage->Read("position");  // read
Object->Storage->Delete("position");             // delete

それを行う方法、または別の方法で行う理由

私の質問は、この問題に対する一般的なアプローチがあるかどうか、および適切な解決策は何かということです。私の考えが正しくなく、私の目的(次の段落)のためにデータを保存する別の手法または場所がある場合は、教えてください。

オプションの背景情報とコンテキスト

この必要性の背後にある理由は、一種のコンポーネント ベースのゲーム エンジンを書いているからです。コンポーネントとシステムがあります。システムはタイトル メニューまたはワールド レベルにすることができ、必要な数のコンポーネントをシステムに追加できます。ゲームティックごとに、システムはすべてのコンポーネントに対して指定されたメソッドを呼び出します。コンポーネントは、物理、地形、描画、キャラクター、サウンドなどです。前述の未知のデータ構造は、コンポーネントがそのシステムに格納できる必要があるものです。コンポーネントはほぼ静的であり、その状態は使用するストレージによって異なります。このストレージ システムは、(イベント マネージャと共に) コンポーネント間の通信に使用されます。

編集:

調査の結果、私が求めているのは、ソフトウェア設計においてデータ中心またはデータ指向と呼ばれるものであることがわかりました。これで、このトピックについてさらに調査を行うための出発点ができました。Michael Anderson さん、回答ありがとうございます。おそらくそれを使用します。

4

2 に答える 2

3

あなたはおそらくboost::anyこの種のものに使用したいと思うでしょう。

コードは次のようになります。

std::map<std::string,boost::any> object;
object["position"] = 42.0f;

//This will throw if the type is wrong
int Result = boost::any_cast<float>(object["position"]);
object.erase("position");
于 2012-10-17T05:17:39.740 に答える
1

標準テンプレート ライブラリ (STL)、より具体的には、マップの使用はニーズに合っていませんか?

http://en.cppreference.com/w/cpp/container/map

マップを使用して、次のいずれかの値を保持できます。

1) 可能なすべての変数/オブジェクト型の和集合である「CustomObject」。

2) 実際のオブジェクト/変数へのポインター。

于 2012-10-17T05:07:44.797 に答える