正直なところ、私が経験している問題に対してタイトルが正しいかどうかはわかりません. 問題はこうです。Engine というクラスがあり、そのインスタンスが 1 つあります。
testTexture
カスタムTexture
クラスtestObject
のインスタンスである と、カスタム オブジェクト クラスのインスタンスであるという 2 つのメンバ変数が含まれています。
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;
}
経験豊富なあなたにとって、これらは正しく見えますか? 残念ながら、これだけでは問題は解決しないようです。