オブジェクトのベクトルを含むオブジェクトをバイナリ ファイルに保持しようとしています。
ファイルコードからの負荷の一部を次に示します。
template <class T> void read(T* obj,std::ifstream * file) {
file->read((char*)(obj),sizeof(*obj));
file->seekg(int(file->tellg())+sizeof(*obj));
}
void read_db(DB* obj,std::ifstream * file) {
read<DB>(obj,file);
for(int index = 0;index < obj->Arrays.size();index++) {
std::cin.get(); //debugging
obj->Arrays[0].Name = "hi"; //debugging
std::cin.get(); //debugging
std::cout << obj->Arrays[0].Name;
read<DB_ARRAY>(&obj->Arrays[index],file);
for(int row_index = 0;row_index < obj->Arrays[index].Rows.size();row_index++) {
read<DB_ROW>(&obj->Arrays[index].Rows[row_index],file);
for(int int_index = 0;int_index < obj->Arrays[index].Rows[row_index].i_Values.size();int_index++) {
read<DB_VALUE<int>>(&obj->Arrays[index].Rows[row_index].i_Values[int_index],file);
}
}
}
}
DB/DB_ARRAY クラスは次のとおりです。
class DB {
public:
std::string Name;
std::vector<DB_ARRAY> Arrays;
DB_ARRAY * operator[](std::string);
DB_ARRAY * Create(std::string);
};
class DB_ARRAY {
public:
DB* Parent;
std::string Name;
std::vector<DB_ROW> Rows;
DB_ROW * operator[](int);
DB_ROW * Create();
DB_ARRAY(DB*,std::string);
DB_ARRAY();
};
したがって、read_db 関数の最初の引数は正しい値になり、オブジェクトのベクトル配列は正しいサイズになりますが、obj->Arrays から任意のオブジェクトの任意の値にインデックスを付けると、アクセス違反の例外がスローされます。
std::cout << obj->Arrays[0].Name; // error
std::cout << &obj->Arrays[0]; // no error
後者は常に同じアドレスを出力するので、char* にキャストされたオブジェクトを保存すると、そのアドレスも保存されますか?