在文件中存储 class 个实例
Storing class instances in a file
我正在尝试使用 C++ 制作一个角色扮演游戏,目前只是一个文本角色扮演游戏。我想创建很多 class "monster" 的实例。假设我需要制作 100 个怪物(哥布林、食人魔、龙等),我应该如何存储这些怪物?我是否应该有一个单独的文件专门用于存储 class 个实例,如果是,如何存储?我想将它们全部放在一个文件中,这样它就不会在其他地方占用 space。
你可以在文件中存储对象的实例,这叫做序列化,有很多方法可以实现,我建议在这个方向多研究一下。
我相信您不必为您的程序执行此操作,因为可能 space 足以存储您所有的怪物,然后再存储一些。
您可以将 class 存储在 binary
文件中并使用 write
和 read
。
也许这就是你想要做的,这是一个简单的例子。
假设我们有这个 class:
class Goblin {
public:
int health;
int damage;
};
还有一个文件要写入到:
fstream file("record.bin", ios::trunc | ios::binary | ios::in | ios::out);
现在我们可以创建一个 Goblin
对象:
Goblin my_goblin;
my_goblin.health = 100;
my_goblin.damage = 50;
然后我们就可以将数据写入二进制文件了:
file.write(reinterpret_cast<char*>(&my_goblin.health), sizeof(my_goblin.health));
file.write(reinterpret_cast<char*>(&my_goblin.damage), sizeof(my_goblin.damage));
在 运行 之后,二进制文件将包含关于您的 Goblin
class.
的数据
现在,为了读取数据,您不需要 ios::trunc
标志:
fstream file("record.bin", ios::binary | ios::in | ios::out);
我们再次创建一个Goblin
对象:
Goblin goblin;
然后我们可以将数据读入我们的 class:
if (!file.read(reinterpret_cast<char*>(&goblin.health), sizeof(goblin.health))) {
// handle error
}
if (!file.read(reinterpret_cast<char*>(&goblin.damage), sizeof(goblin.damage))) {
// handle error
}
现在打印以查看它是否正常工作:
// Output result if all went well
cout << "Goblin health = " << goblin.health << '\n';
cout << "Goblin damage = " << goblin.damage << '\n';
输出:
Goblin health = 100
Goblin damage = 50
这个真的没必要!
对于制作基于文本的游戏,您不需要上述方法。只需编写您的 classes 并将它们保存在头文件中。将声明与实现分开。
例如:Goblin.h
、Goblin.cpp
、Dragon.h
、Dragon.cpp
等
我正在尝试使用 C++ 制作一个角色扮演游戏,目前只是一个文本角色扮演游戏。我想创建很多 class "monster" 的实例。假设我需要制作 100 个怪物(哥布林、食人魔、龙等),我应该如何存储这些怪物?我是否应该有一个单独的文件专门用于存储 class 个实例,如果是,如何存储?我想将它们全部放在一个文件中,这样它就不会在其他地方占用 space。
你可以在文件中存储对象的实例,这叫做序列化,有很多方法可以实现,我建议在这个方向多研究一下。
我相信您不必为您的程序执行此操作,因为可能 space 足以存储您所有的怪物,然后再存储一些。
您可以将 class 存储在 binary
文件中并使用 write
和 read
。
也许这就是你想要做的,这是一个简单的例子。
假设我们有这个 class:
class Goblin {
public:
int health;
int damage;
};
还有一个文件要写入到:
fstream file("record.bin", ios::trunc | ios::binary | ios::in | ios::out);
现在我们可以创建一个 Goblin
对象:
Goblin my_goblin;
my_goblin.health = 100;
my_goblin.damage = 50;
然后我们就可以将数据写入二进制文件了:
file.write(reinterpret_cast<char*>(&my_goblin.health), sizeof(my_goblin.health));
file.write(reinterpret_cast<char*>(&my_goblin.damage), sizeof(my_goblin.damage));
在 运行 之后,二进制文件将包含关于您的 Goblin
class.
现在,为了读取数据,您不需要 ios::trunc
标志:
fstream file("record.bin", ios::binary | ios::in | ios::out);
我们再次创建一个Goblin
对象:
Goblin goblin;
然后我们可以将数据读入我们的 class:
if (!file.read(reinterpret_cast<char*>(&goblin.health), sizeof(goblin.health))) {
// handle error
}
if (!file.read(reinterpret_cast<char*>(&goblin.damage), sizeof(goblin.damage))) {
// handle error
}
现在打印以查看它是否正常工作:
// Output result if all went well
cout << "Goblin health = " << goblin.health << '\n';
cout << "Goblin damage = " << goblin.damage << '\n';
输出:
Goblin health = 100
Goblin damage = 50
这个真的没必要!
对于制作基于文本的游戏,您不需要上述方法。只需编写您的 classes 并将它们保存在头文件中。将声明与实现分开。
例如:Goblin.h
、Goblin.cpp
、Dragon.h
、Dragon.cpp
等