gpt4 book ai didi

c++ - 我误解了指针的工作原理吗?

转载 作者:行者123 更新时间:2023-11-28 00:00:09 25 4
gpt4 key购买 nike

我有一个 Matrix 类和另一个我想在其中使用 Matrix 的 Camera 类。我的 Matrix 类如下所示:

class Matrix4f {
public:
Matrix4f() {
this->setMatrix(EMPTY);
}

Matrix4f(Matrix4f &m2) {
this->setMatrix(m2.matrix);
}

static Matrix4f& Matrix4f::identity() {
Matrix4f& identity = Matrix4f() ;
identity.setMatrix(IDENTITY);
return identity;
}

void setMatrix(float f[4][4]) {
for (int r = 0; r < 4; r++) {
for (int c = 0; c < 4; c++) {
this->matrix[r][c] = f[r][c];
}
}
}

Matrix4f& operator=(const Matrix4f &m2) {
this->setMatrix(m2.matrix);
}
private:
float matrix[4][4];
static float EMPTY[4][4] = {
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 }
}; // initialize an empty array (all zeros);
static float IDENTIY[4][4] = {
{ 1, 0, 0, 0 },
{ 0, 1, 0, 0 },
{ 0, 0, 1, 0 },
{ 0, 0, 0, 1 }
}; // initialize a identity (array)
}

我的相机课上有这个:

class Camera {
public:
Camera() {
this->calculateProjection();
}

Matrix4f* getProjection() {
return this->projection;
}
private:
Matrix4f* projection;

Matrix4f* calculateProjection() {
this->projection = &Matrix4f::identity();
// modify this->projection...

return this->projection;
}
}

当我尝试创建一个 Camera 实例然后获取它的投影时,我得到的东西看起来像一个损坏的对象(矩阵完全填充为大的负数)。

我真的很困惑什么导致我的代码出现这样的错误行为。
我相当确定它处理一个被编译器自动删除的引用,我认为它处理单位矩阵,但它实际上没有意义。

难道不应该将单位矩阵复制到投影矩阵中,所以即使单位矩阵被垃圾收集也没有关系吗?

我发现我实际上可以使这段代码工作使单位矩阵创建一个新的 Matrix4f() 并返回该矩阵或使 getProjection() 返回 calculateProjection()。
问题是,我真的不想做其中任何一个。
我不想让 Identity 构造一个新的 Matrix4f,因为那样我就必须处理销毁它的问题,而且我不想getProjection() 来调用 calculateProjection(),因为该方法很昂贵,
并且实际上应该只调用一次,因为投影矩阵永远不会改变。

最佳答案

你的

 Matrix4f& Matrix4f::identity() {
Matrix4f& identity = Matrix4f() ;
identity.setMatrix(IDENTITY);
return identity;
}

返回对本地对象的引用。一旦 identity() 退出,对象就消失了。

您需要在堆上分配它然后返回它。

或者在类 Camera 中声明一个矩阵

  ...
private:
Matrix4f projection;

Matrix4f& calculateProjection() {
... modify ...
return this->projection;
}
...

关于c++ - 我误解了指针的工作原理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39783523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com