老实说,我不知道标题是否适合我遇到的问题。问题是这样的。我有一个名为 Engine 的类,其中有一个实例。
它包含两个成员变量(除其他外)testTexture
,我的自定义Texture
类testObject
的一个实例和我的自定义对象类的一个实例。
在 Engine 函数中,Init
它们的值是这样设置的:
testTexture = Texture(0, TEXT("D:\\spriteWallVertical112.png"),
renderer.ReturnDevice());
testObject = Object(0,testTexture.textureID, D3DXVECTOR3(0,0,0),
D3DXVECTOR3(100,100,100), testTexture.texture, &renderer);
这一切似乎都按照我的意愿运行,它们的值被存储并且似乎保持良好。
但是,在Object
类构造函数内部调用了我的Renderer
类中的一个函数AddNewTextureObject
:
rendererPointer->AddNewTextureObject(&objectID, &textureID, textureInput,
&origin, &coordinates);
这似乎很顺利,但是当程序运行这些值时,指针似乎会随着程序的继续而被覆盖。它们不会立即成为垃圾记忆,但很明显它们是。我可以根据需要提供代码,但我不想只是用与问题无关的代码向这个问题发送垃圾邮件,特别是如果其他人可能会看到我做错了明显的事情。
但是,我现在将发布TextureObject
课程代码,因为我认为它在这里最相关:
#ifndef TEXTUREOBJECT_H
#define TEXTUREOBJECT_H
#ifndef UNICODE
#define UNICODE
#endif
#include <d3dx9.h>
class TextureObject
{
public:
TextureObject();
TextureObject(unsigned int *, int *, LPDIRECT3DTEXTURE9, D3DXVECTOR3 *, D3DXVECTOR3 *);
~TextureObject();
unsigned int *objectID; // The object with the texture. Use this for locating and deleting this instance of TextureObject.
int *textureID;
LPDIRECT3DTEXTURE9 texture; // May not be needed if we can simply select the texture via ID.
const D3DXVECTOR3 *origin; // Needed for drawing rotations....I think.
D3DXVECTOR3 *coordinates;
int maintainMe;
};
#endif
如果我分配给它,该变量maintainMe
确实保持其值。
这是AddNewTextureObject()
函数的代码:
void Renderer::AddNewTextureObject(unsigned int *objectIDInput, int *textureIDInput, LPDIRECT3DTEXTURE9 textureInput, D3DXVECTOR3 *originInput, D3DXVECTOR3 *coordinatesInput)
{
//testTextureObject = TextureObject(objectID, textureID, textureInput, originInput, coordinatesInput);
testTextureObject.objectID = objectIDInput;
testTextureObject.textureID = textureIDInput;
testTextureObject.texture = textureInput;
testTextureObject.origin = originInput;
testTextureObject.coordinates = coordinatesInput;
testTextureObject.maintainMe = 3067;
请注意,任何一种分配值的方法都会testTextureObject
导致问题。
对此的任何帮助将不胜感激。
编辑:
这是Object
该类的构造函数:
Object::Object(unsigned int objectIDInput, int textureIDInput, D3DXVECTOR3 originInput, D3DXVECTOR3 coordinatesInput, LPDIRECT3DTEXTURE9 textureInput, Renderer *rendererInput)
{
objectID = objectIDInput;
textureID = textureIDInput;
origin = originInput;
coordinates = coordinatesInput;
rendererPointer = rendererInput;
rendererPointer->AddNewTextureObject(&objectID, &textureID, textureInput, &origin, &coordinates);
}
它Object.h
在Object
类中声明为 public,如下所示:
Object(unsigned int, int, D3DXVECTOR3, D3DXVECTOR3, LPDIRECT3DTEXTURE9, Renderer *);
EDIT2:我制作了一个复制构造函数和一个赋值运算符:
Object::Object(const Object &source)
{
objectID = source.objectID;
textureID = source.textureID;
texture = source.texture;
origin = source.origin;
coordinates = source.coordinates;
rendererPointer = source.rendererPointer;
}
Object& Object::operator=(const Object &source)
{
if(this == &source)
{
return *this;
}
objectID = source.objectID;
textureID = source.textureID;
texture = source.texture;
origin = source.origin;
coordinates = source.coordinates;
rendererPointer = source.rendererPointer;
return *this;
}
这些对您更有经验的人来说是否正确?不幸的是,仅此一项似乎并不能解决问题。