小编shw*_*eph的帖子

使用指针将char*转换为unsigned char*

我正在编写一些使用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让我有点紧张,因为我通常不会使用它,而且我被告知要多次小心它.

c++ pointers fstream reinterpret-cast

8
推荐指数
1
解决办法
3103
查看次数

我的c ++游戏架构

我是一个相当有经验的程序员,但我仍然相对较新的OOP架构和c ++设计.我的大部分经验都是使用C#和Java.我最近努力用c ++编写一个简单的游戏引擎.我使用SDL作为图形.在这篇文章中,我想讨论我的架构并获得一些反馈.特别是,我遇到了一个我想要帮助的设计问题.所以,这里是:

  • 在我的主要功能中,我初始化所有SDL内容以绘制到屏幕等.
  • 然后我实例化我打算使用的所有对象:floor,wall,player等.
  • 接下来我开始主循环.该循环执行每个对象的移动,碰撞检测和碰撞处理功能,并重绘它们.
  • 主循环运行直到应用程序退出,每次迭代绘制一帧.

我的问题是:我尝试做一种界面风格的设计.它涉及一系列允许每个对象实现行为的抽象基类.例如,如果我想要一个对象是可移动的,那么它必须从包含被调用的虚函数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指针,但这并不像我想要的那样工作.我一直在阅读有关视频游戏的游戏对象组件架构,我可能会尝试,但我真的想要挽救我已经写过的内容.我认为这是一个很好的学习机会.如果有人有任何想法我会非常感激.我的架构与其他简单的游戏引擎设计相比如何?我的界面架构是否有意义还是完全不稳定?

c++ architecture oop interface game-engine

7
推荐指数
1
解决办法
1613
查看次数