静态函数的意外行为
Unexpected Behavior of a Static Function
我正在做一个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 copy 上运行。要更改原始矩阵,您必须像这样声明函数:
static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX& world);
更传统的方法是使用指针,如下所示:
static bool PlaceObjectInMatrix(const EntityBase& obj, D3DXMATRIX* world);
这样,任何阅读调用代码(如PlaceObjectInMatrix(*entities[i].entry,&worldMatrix(的人都会意识到,该函数将改变worldMatrix对象。
static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world)
world
参数按值传递,因此函数获取自己的副本,并且调用方中的变量不会更改。 这可能是您的问题。
使用指针(如D3DXMatrixTranslation
(或引用,您的问题可能会消失。
相关文章:
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 概念解析为使用 std::make_signed_t 时意外的函数模板
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++无法访问或使用静态函数
- 如何将 cpp 文件中的静态函数公开给其他文件
- 将函数的引用设置为其他 c++ 文件中的非静态函数
- 方法的静态函数的等价性
- 静态函数的意外行为
- 当从固定结构体中存储的对象构建函数时,c++ lambda构建静态函数返回意外值