小编Bin*_*ngo的帖子

重载成员访问运算符 - > ,.*(C++)

据我所知大多数运算符重载,与成员访问运营商外->,.*,->*等.

特别是,传递给这些操作符函数的内容以及应返回的内容是什么?

操作员如何运作(例如operator->(...))知道所指的成员是什么?可以知道吗?它甚至需要知道吗?

最后,是否需要考虑常见因素?例如,当重载类似的东西时operator[],通常你需要const和非const版本.成员访问运算符是否需要const和非const版本?

c++ operator-overloading c++-faq

119
推荐指数
5
解决办法
8万
查看次数

如何在单个gcc命令中将多个头包含和库目录添加到搜索路径?

如何在单个gcc命令中将多个头包含和库目录添加到搜索路径?

c gcc

63
推荐指数
3
解决办法
6万
查看次数

是否存在跨std :: multimap中唯一键的迭代器?

是否有一种简单或标准的方法来使用多图迭代器迭代多图中的唯一键?

即对于一个看起来像的集合:{1, "a"}, {1, "lemon"}, {2, "peacock"}, {3, "angel"} 一个迭代器,它会在{1, "a"}然后开始递增,指向{2, "peacock"}然后再次递增会指向{3, "angel"}

c++ multimap

39
推荐指数
3
解决办法
1万
查看次数

精确为零的float/double相等

我有一个使用floatsdoubles执行一些计算的算法.

例:

double a;
double b;
double c;
...
double result = c / (b - a);
if ((result > 0) && (result < small_number))
{
    // result is relevant...
} else {
    // result not required...
}
Run Code Online (Sandbox Code Playgroud)

现在,我担心(b - a)可能是零.如果它接近于零而不是零,则无关紧要,因为result它将超出范围是有用的,并且我已经检测到(当(b - a)接近零时,result将接近+/- inf,这不在范围内0- small_number. ..)

但如果结果(b - a)恰好为零,我预计由于除以零而会发生某种平台依赖.我可以将if声明更改为:

if ((!((b-a) == 0.0)) && ((result = c/(b-a)) > 0) && (result …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point

9
推荐指数
2
解决办法
3万
查看次数

是否可以在编译时阻止特定基类的多重继承?

我要做的是开发两个不同的基类,这些基类不应该在一个派生类中一起继承.有什么办法可以在编译时强制执行吗?

class Base1 {};
class Base2 {};
class Derived1 : public Base1 {} // OK!
class Derived2 : public Base2, public Other {} // OK!
class Derived3 : public Base1, Base2 {} // Can I force the compiler to complain?

Derived1 d1; // OK!
Derived2 d2; // OK!
Derived3 d3; // Or can I force the compiler to complain here?
Run Code Online (Sandbox Code Playgroud)

我知道文档是一个好主意,只是想知道它是否可行.

c++ multiple-inheritance

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

物理引擎的继承/接口决策

这适用于在MinGW/Windows上使用SDL的小型游戏项目.

我正在研究一个物理引擎,我的想法是拥有一个Physics::Object所有物理对象应该从中得到的东西,并且它用全局Physics::System类(它是一个单独的模式)注册自己,这样用户就不需要跟踪哪些对象了包含在物理计算中,只需要调用一个函数Physics::System::PerformTimestepCalculation(double dt).

这工作正常,我甚至使用单个派生类实现它Physics::Circle,这是一个2d圈.我对预测性碰撞检测非常满意,即使我仍然需要优化它.

无论如何,当我开始添加其他原语以包含在计算中时,我遇到了麻烦,例如line.将Physics::System::PerformTimestepCalculation(double dt)成为与将呼叫散落Object::GetID()或类似的功能(5办法避免的dynamic_cast <>),但我觉得脏.

我做了一些阅读并意识到我的层次结构中的元素不可替代(即两个圆之间的碰撞在两条线的碰撞之间非常不同).

我喜欢我Physics::ObjectsSystem课堂上"自我注册"的方式,所以它们会自动包含在计算中,我真的不想失去这个.

必须有一些其他合理的设计路径.我怎样才能更好地重新设计东西,以便不可替代的对象不会妨碍?

编辑FYI: 最后,我已经打破了实体和形状属性,类似于在接受的答案中描述的方式,类似于实体 - 组件 - 系统模型.这意味着我仍然有yuk逻辑"这是一个圆圈还是一条线,是一条线还是一条圆?",但我不再假装多态在这里帮助我.这也意味着我使用某种工厂,可以同时发生多个计算世界!

c++ inheritance game-physics

6
推荐指数
1
解决办法
984
查看次数

游戏引擎的分配器

我目前正在编写一个游戏引擎的内存分配系统,我想知道是否有任何经验丰富的开发人员可以帮助提出有关分配器结构有用的一些建议.

我知道这对某些人来说听起来有点担心,所以我想我需要证明一下我的立场.我已经在这里这里阅读了答案(以及他们在这里,这里这里指出的博客).但是看,我已经尝试过"先制作一个游戏,一遍又一遍,然后重复使用的代码就是你的'引擎'",这对我来说并没有真正起作用.我发现我实际上陷入了我一次又一次做的事情(可能没有很好地重用我的代码)并且在任何游戏中都没有走得太远.

所以,我决定将这些我再次重复使用的东西编码一次又一次......做一次,把它放在一边.

我真的发现自己离开了联盟,所以我买了几本书.Jason Gregory(GEA)的游戏引擎架构非常好,顺便说一句,但我也有游戏编码完成(McShaffry)和编程游戏AI示例(Buckland).GEA对高性能分配器有一些非常好的想法,这真的让我感兴趣,所以我想我会试一试.

我编写了一个基于堆栈的分配器,几乎完成了一个基于池的分配器.两者都具有内存对齐的能力,并且可以被分配以使用不同的内存预算(即,任何分配器可以例如使用"零售"存储器或"开发"存储器等).我发现只是根据我的编程技巧/兴趣水平创建这些组件是一件有益的事情.

我想知道是否有任何开发人员愿意推荐任何其他有用的或在游戏开发中经常出现的分配器结构.?或者,是否有任何开发人员在其整个职业生涯中从未使用过任何其他东西?

再次证明我的问题是正确的(我几乎可以听到人们在窃窃私语"只做自己的游戏,看看你需要什么样的结构......",但是......)游戏引擎架构对我来说是一个很好的资源,因为作者愿意和毫不掩饰地说"嘿,这是业界最重要的事情".如果有人可以做一些"体验 - 重用"并说"考虑这个结构",那么它可以节省我很多时间来编写一大堆游戏并找出有用的东西.

c c++ memory-management

5
推荐指数
1
解决办法
2933
查看次数

C++迭代器和反向迭代器

我正在写一个iterator(实际上它是const_iterator我当前的对象,我也想创建一个reverse_const_iterator.

我环顾四周,看看如何做到这一点,我偶然发现了这个:

但是请注意,当反转迭代器时,反转版本不会指向范围内的相同元素,而是指向它之前的元素.这样,为了安排范围的过去元素:指向范围中的过去元素的迭代器,当被反转时,被更改为指向最后一个元素(不是通过它) )范围(如果反转,这将是范围的第一个元素).如果一个范围中第一个元素的迭代器被反转,则反转的迭代器指向第一个元素之前的元素(如果反转,这将是范围的过去元素).

这是从用户的角度发生的事情,或者当你取消引用时reverse_iterator它是不是通过给你你认为它指向的对象的值/引用来抽象它?这只是实施细节吗?

我的理解是:

for(i = obj.rbegin(); i != obj.rend(); i++)
Run Code Online (Sandbox Code Playgroud)

相当于

for(i = obj.begin(); i != obj.end(); i++)
Run Code Online (Sandbox Code Playgroud)

除了相反.因此*i,在第一种情况下,将向后通过容器,并在第二种情况下向前通过容器.我的直觉是否正确?

c++ iterator

5
推荐指数
1
解决办法
7748
查看次数

PostMessage似乎不起作用?

我正在尝试学习如何使用和接收原始输入消息,因此我设计了以下程序来测试我迄今为止的理解...

当我收到输入消息时,我尝试更改显示的字符串并WM_PAINT在队列中放置新消息.但这个消息似乎没有被调用.只有当我调整窗口大小时,文本才会显示不同.

为什么WM_PAINT消息根本没有得到处理,直到我调整窗口大小为例?

#define _WIN32_WINNT 0x501
#include <Windows.h>
#include <assert.h>
#include <cstring>
#include <cstdio>

LRESULT CALLBACK WinProcedure(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

int WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int nCmdShow)
{
    WNDCLASS wc;
    HWND hwnd;

    wc.hInstance = hInst;
    wc.lpfnWndProc = WinProcedure;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "Untitled";

    if (!RegisterClass(&wc)) {
        // Error registering class
        return -1; …
Run Code Online (Sandbox Code Playgroud)

c windows winapi

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

调试为什么size_t不能作为数据成员工作?

有人可以告诉我为什么第一个程序崩溃,但第二个程序没有崩溃?第一个(崩溃):

#include <cstdlib>
class test
{
public:
    test(const char *cstr)
    {
        size_t j=0;
        while(cstr[n++])
            ;
        //n = j;
    }
private:
    size_t n;
};

int main()
{
    test("Hello, world!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第二个不会崩溃(使用构造函数的本地变量而不是数据成员来计算):

   #include <cstdlib>
    class test
    {
    public:
        test(const char *cstr)
        {
            size_t j=0;
            while(cstr[j++])
                ;
            n = j;
        }
    private:
        size_t n;
    };

    int main()
    {
        test("Hello, world!\n");
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

在Windows上运行MinGW.make:* [run]错误-1073741819

c++

0
推荐指数
1
解决办法
354
查看次数