c++ - 静态函数的意外行为

标签 c++ static

我正在处理一个 DX11 项目,我得到了一个静态函数的奇怪行为。我对静态函数有点不了解,所以我可能在某个地方犯了错误。

我的功能很简单:

namespace Rendering
{
    static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world)
    {

        D3DXMatrixTranslation(&world, obj->GetPosition()->x, obj->GetPosition()->y, obj->GetPosition()->z); 
        return true;
    }
}

并在循环中调用它来渲染所有对象:

for(unsigned int i = 0; i < listSize; i++)
    {

        if(entities[i].taken == false)
            continue; 
        entities[i].entry->Render(deviceContext, shader);

        PlaceObjectInMatrix(entities[i].entry, worldMatrix);

        if(entities[i].entry->GetIndexCount() != 0) 
        {
            shader->Render(deviceContext, entities[i].entry->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, entities[i].entry->GetTexture(), m_debugLight->GetDirection(), m_debugLight->GetDiffuseColor());
            objectsRendered++;
        }

        d3d->GetWorldMatrix(worldMatrix); //reset world matrix
    }

但是,它不起作用。但是,当我用函数本身中的内容替换带有函数调用的行时,它确实有效。就像在函数调用中丢失了某些东西。

EntityBase 类是抽象的,我实际渲染的类称为 EntityModelStatic,它派生自 EntityModel。

最佳答案

PlaceObjectInMatrix() 函数对 worldMatrix 拷贝进行操作。要更改原始矩阵,您必须像这样声明函数:

static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX& world);

更常规的方法是使用指针,像这样:

static bool PlaceObjectInMatrix(const EntityBase& obj, D3DXMATRIX* world);

通过这种方式,任何阅读 PlaceObjectInMatrix(*entities[i].entry, &worldMatrix) 调用代码的人都会意识到,该函数将更改 worldMatrix 对象

关于c++ - 静态函数的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8469309/

相关文章:

c++ - 指针不会返回 char 类型的地址

c++ - 使用 istream 参数读取的 istream 函数

java - 请看下面的代码。代码运行良好。输出为[10,11]。 Final A a = new A(); 行的含义是什么?

java - 从静态外部 util 函数访问内部类

c++ - 我应该使用静态数据成员吗? (C++)

c# - 在什么情况下我不应该在类中使用静态成员?

c++ - 在 C++ 中将 HWND 包装在对象中的有效方法是什么?

c++ - C++ AMP的现状是什么

c# - 如何将值从 C++ 主应用程序返回到 C# GUI 应用程序?

c++ - "undefined reference"到静态字段模板特化