Я делаю порт для j2me-игры на iPhone, используя C ++, и у меня странная проблема.Мои навыки C ++ не самые лучшие, я пришел из нескольких лет разработки Java, и я не касался C ++ в течение многих лет.Моя проблема в том, что у меня есть член класса, который назначен на конструктор, но я получил EXC_BAD_ACCESS, когда я пытаюсь получить доступ к этой переменной в методе этого класса.Я занимался серфингом в Интернете, и я не могу найти проблему, я надеюсь, что вы можете помочь мне с этим.Вот модифицированная версия кода:
GameCanvas.h
#include "Graphics.h"
#include "defs.h"
class GameCanvas {
Graphics* canvasGraphics;
public:
GameCanvas(void);
Graphics* getGraphics(void);
};
GameCanvas.cpp
#include <stdio.h>
#include "GameCanvas.h"
#include "Wrap-C-Interface.h"
GameCanvas::GameCanvas(void)
{
canvasGraphics = new Graphics();
// Sets up matrices and transforms for OpenGL ES
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, 320.0f, 480.0f);
glOrthof(0.0f, 320.0f,
480.0f, 0.0f,
-1.0f, 1.0f);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glOrthof(0.0f, 512.0f*2,
0.0f, 512.0f*2,
-1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
// Clears the view with black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Enable use of the texture
glEnable(GL_TEXTURE_2D);
// Set a blending function to use
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Enable blending
glEnable(GL_BLEND);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
}
Graphics* GameCanvas::getGraphics(void)
{
// Here canvasGraphics is no longer alive, i got an EXC_BAD_ACCESS
return canvasGraphics;
}
Graphics.h
#include "defs.h"
#include "iGraphics.h"
#include "Image.h"
class Graphics
{
public:
int test;
Graphics(void);
void setColor(int RGB);
void setColor(int red, int green, int blue);
void fillRect(int x, int y, int width, int height);
private:
Image* buffer;
GLuint textureFrameBuffer;
};
Graphics.cpp
#include "Graphics.h"
#include "Wrap-C-Interface.h"
Graphics::Graphics(void)
{
test = 314;
buffer = Image::createImage(512, 512);
// create framebuffer
glGenFramebuffersOES(1, &textureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);
// attach renderbuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, buffer->tex2d->texture, 0);
// restore frame buffer
restoreFrameBuffer();
};
void Graphics::setColor(int red, int green, int blue)
{
glColor4ub(red, green, blue, 255);
}
void Graphics::setColor(int RGB)
{
glColor4ub(RGB>>16&0xff, RGB>>8&0xff, RGB&0xff, 255);
}
void Graphics::fillRect(int x, int y, int width, int height)
{
GLshort vertices[] = {
x, y,
x + width, y,
x, y + height,
x + width, y + height,
};
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_SHORT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
// restore default state
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
}
РЕДАКТИРОВАНИЕ:
Я не упомянул в оригинальном сообщении, что он вызывает вызов getGraphics () из GameCanvas, любой доступ к canvasGraphics внутри getGraphics дает EXC_BAD_ACCESS.Один пример, если я поместил эту строку после того, как этот объект Graphics был создан в конструкторе GameCanvas, он работает как положено:
canvasGraphics = new Graphics();
printf("canvasGraphics %i\n", canvasGraphics->test);
Но эта команда printf для метода getGraphics дает EXC_BAD_ACCESS.
Graphics* GameCanvas::getGraphics(void)
{
// Here canvasGraphics is no longer alive, i got an EXC_BAD_ACCESS
printf("canvasGraphics %i\n", canvasGraphics->test);
return canvasGraphics;
}