【发布时间】:2012-08-10 19:21:57
【问题描述】:
我正在 c++ 中创建一个 Camera 类,用于 OpenGL。当我尝试打印在Camera.h 中声明的任何变量时,程序崩溃。但是如果我设置或获取变量的值它不会崩溃我做错了什么?
相机.h
#ifndef CAMERA_H
#define CAMERA_H
class Camera
{
public:
Camera();
Camera(float xP, float yP, float zP);
void move(float x, float y, float z);
protected:
private:
float xPos, yPos, zPos;
};
#endif // CAMERA_H
Camera.cpp
#include "Camera.h"
#include <iostream>
#include <GL/glut.h>
using namespace std;
Camera::Camera()
{
}
Camera::Camera(float xP, float yP, float zP)
: xPos(xP), yPos(yP), zPos(zP)
{
}
void Camera::move(float x, float y, float z)
{
glTranslatef(-x, -y, -z);
//None of this crashes:
xPos = 1;
yPos = xPos;
//Crashes here:
cout << "mainCamera x = " << xPos << endl;
}
我收到的崩溃消息是:
opengl.exe 遇到问题需要关闭。给您带来的不便,我们深表歉意。
编辑
如果我将float xPos, yPos, zPos; 放在Camera.h 的公共部分,然后调用
Camera mainCamera(0.0f, 0.0f, 0.0f);
cout << "mainCamera x = " << mainCamera.xPos << endl;
...在main.cpp 中,它可以正常工作并打印:
主摄像头 x = 0
【问题讨论】:
-
它是如何崩溃的?你得到什么错误?在哪里,在程序的哪一行?你能说明你是如何调用移动函数的吗?
-
您可能应该在
Camera::Camera()构造函数中初始化xPos、yPos和zPos的值。可能是0。 C++ 不保证数值变量从0开始。不过,这不应该导致崩溃。 -
问:你在哪个平台上?视窗? Linux?还有什么?问:您是从终端会话还是命令提示符运行?你甚至可以在你的程序环境中做终端输出(“cout/printf”)吗?问:你们有调试器(MSVS 或 gdb)吗?
-
由于您是 C++ 新手,我的第一个建议是学习如何使用调试器来逐步执行代码并检查变量值。
-
我怀疑 OpenGL 初始化有问题,因此
glTranslatef将结果矩阵写入不应该的地方,导致内存损坏。这不需要直接影响Camera实例 - 例如cout实现或堆可能已损坏。如果这是真的,我们需要查看初始化代码,我们还需要一个 OpenGL 专家(我不是)。
标签: c++ opengl header crash runtime-error