その為にどの様な形式のデータでも保存でき、保存されているデータを引き出すときに保存する時に指定したid(文字列)を指定して引き出せるというdata classを実装したいです
また、不要になった時にidから削除、すべて開放等の機能も欲しいです
文字通りの要件を満たすクラスは、C++17標準ライブラリを用いて実現可能です。https://wandbox.org/permlink/5zeAYeOkgJuJgVwQ
C++
1#include <string>
2#include <map>
3#include <any>
4#include <iostream>
5
6// std::stringリテラル
7using namespace std::string_literals;
8
9// 文字列をキーにあらゆるデータ型を格納できるマップ
10using AnyMapType = std::map<std::string, std::any>;
11
12AnyMapType global_vars;
13
14
15int main()
16{
17 // "number"をキーに値42を格納
18 global_vars["number"s] = 42;
19 // "greeting"をキーに文字列"Hello"を格納
20 global_vars["greeting"s] = "Hello"s;
21
22 // キー"number"をもつ数値を取り出し
23 auto number = std::any_cast<int>(global_vars["number"s]);
24 std::cout << number << std::endl;
25
26 // キー"greeting"をもつ文字列を取り出し
27 auto greeting = std::any_cast<std::string>(global_vars["greeting"s]);
28 std::cout << greeting << std::endl;
29
30 // キー"greeting"を削除(文字列"Hello"は自動的に解放される)
31 global_vars.erase("greeting"s);
32
33 try {
34 // 削除済みのキー"greeting"をもつ文字列を取り出そうとすると...
35 auto greeting = std::any_cast<std::string>(global_vars["greeting"s]);
36 std::cout << greeting << std::endl;
37 } catch (std::bad_any_cast&) {
38 // 例外std::bad_any_castが送出される
39 std::cout << "(No greeting)" << std::endl;
40 }
41}
オブジェクト思考としてデータを参照しあうもっといい方法があれば指摘していただければ嬉しいです
プログラムの設計は、具体的な問題の解決手段をさぐるモデリング作業です。残念ながら、あなたの質問内容からは「ケース・バイ・ケースですね」としかお答えできません。
確実に言えるのは、前掲のような「文字列をキーとして何でも格納できるデータ型」は、C++言語としては 非常にまずい設計 です。何でもできる=自由度が高すぎる設計では、あらゆることがプログラマの責任になっています。
先ほどのプログラムでうっかりキー名を間違えたら?うっかり対応するデータ型を間違えたら?誰かが勝手にデータを書き換えたら?C++コンパイラは何も助けてくれません。
P.S. 念のため、"オブジェクト思考"→"オブジェクト指向"ですね。