我正在编写一些使用fstream read()函数的代码,这个函数需要一个char*作为缓冲区.稍后,我想使用此缓冲区中的字节作为无符号字符,因此我要么必须:1.将缓冲区声明为char*,然后为每个元素执行static_casts,2.声明缓冲区作为unsigned char*然后在我将它传递给read函数时执行reinterpret_cast,或者3.将缓冲区声明为char*并创建一个用于访问缓冲区作为unsigned char的转换指针.
这是一个片段:
char* buf = new char[512];
unsigned char* ubuf = reinterpret_cast<unsigned char*>(buf);
fstream myfile;
myfile.open("foo.img");
myfile.seekg(446);
myfile.read(buf, 16);
//myfile.read(reinterpret_cast<char*>(buf), 16);
int bytes_per_sector = ubuf[1] << 8 | ubuf[0];
...
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方式,因为我只需要转换一次,我可以只访问缓冲区作为任何一种类型,而不是每次都进行转换.但是,这是一个好习惯吗?有没有什么可以在这里出错?使用reinterpret_cast让我有点紧张,因为我通常不会使用它,而且我被告知要多次小心它.
我是一个相当有经验的程序员,但我仍然相对较新的OOP架构和c ++设计.我的大部分经验都是使用C#和Java.我最近努力用c ++编写一个简单的游戏引擎.我使用SDL作为图形.在这篇文章中,我想讨论我的架构并获得一些反馈.特别是,我遇到了一个我想要帮助的设计问题.所以,这里是:
我的问题是:我尝试做一种界面风格的设计.它涉及一系列允许每个对象实现行为的抽象基类.例如,如果我想要一个对象是可移动的,那么它必须从包含被调用的虚函数move()和一些位置坐标的可移动基类继承.如果我要它是可碰撞,对象会从可碰撞抽象类,其中包含虚拟函数继承checkCollision()和handleCollision()以及一个击中格成员变量.像播放器这样的对象继承了这两个基类以及其他几个基类.
只要我在主循环中手动完成所有操作,这就足够了.我可以说:
player.move();
player.checkCollision();
player.handleCollision();
player.draw().
Run Code Online (Sandbox Code Playgroud)
这没关系.但我希望能够在主循环中有一个矢量或通用对象数组,并执行以下操作:
for each object in vector
if object is of type movable
object.move();
if object is of type collidable
object.checkCollision();
Run Code Online (Sandbox Code Playgroud)
我认为我可以通过动态铸造实现这一目标,但我真的无法想出任何东西.我已经尝试将它们存储为void指针,但这并不像我想要的那样工作.我一直在阅读有关视频游戏的游戏对象组件架构,我可能会尝试,但我真的想要挽救我已经写过的内容.我认为这是一个很好的学习机会.如果有人有任何想法我会非常感激.我的架构与其他简单的游戏引擎设计相比如何?我的界面架构是否有意义还是完全不稳定?