相对较新的C ++,我正在尝试学习使用动态内存。在这种情况下,我用它来存储成员变量。
Quanternion.h
-
#ifndef QUATERNION_H_
#define QUATERNION_H_
class Quaternion
{
private:
double* x = new double();
double* y = new double();
double* z = new double();
double* w = new double();
public:
Quaternion(double x, double y, double z, double w);
Quaternion(const Quaternion& q);
Quaternion& operator=(const Quaternion& q);
~Quaternion();
void setQ(double *_x, double *_y, double *_z, double *_w);
double * getX() { return x; }
double * getY() { return y; }
double * getz() { return z; }
double * getw() { return w; }
};
#endif
Quanternion.cpp
-
#include "Quaternion.h"
Quaternion::Quaternion(double x, double y, double z, double w)
{
double*a = &x;
double*b = &y;
double*c = &z;
double*d = &w;
setQ(a,b,c,d);
}
Quaternion::Quaternion(const Quaternion & q)
{
this->x = q.x;
this->y = q.y;
this->z = q.z;
this->w = q.w;
}
Quaternion & Quaternion::operator=(const Quaternion & q)
{
if (this == &q)
{
return *this;
}
this->x = q.x;
this->y = q.y;
this->z = q.z;
this->w = q.w;
return *this;
}
Quaternion::~Quaternion()
{
}
void Quaternion::setQ(double *_x, double *_y, double *_z, double *_w)
{
this->x = _x;
this->y = _y;
this->z = _z;
this->w = _w;
}
当我创建一个Quaternion对象并设置字段时,尝试通过释放指针来打印其中一个变量,例如X.我没有得到我期待的结果。
int main()
{
Quaternion q1(4, 9, 2, 5);
double*d = q1.getX();
cout << d << endl;
cout << *d << endl;
}
示例输出 -
00B1FB5C
6.26381e+148
我哪里错了?
答案 0 :(得分:2)
您的代码违反了管理原始指针的基本原则 - 您不知道谁拥有它们。相同的指针可能是通过new分配的实体,或者只是构造函数中提供的地址。这使得拥有那些不可能的东西 - 你不能编写赋值运算符或复制构造函数(你当前的实现错误)。
更直接的问题是你正在记住你的4双构造函数中的参数地址。这是悬空指针和未定义行为的直接原因。
如果您想学习如何使用指针,您需要阅读一本关于它的书。如果您只需要使用类似指针的语义,请使用智能指针。
答案 1 :(得分:1)
我很确定你的编译器给了你一些警告。在构造函数中,您将获取四个初始化参数x
,y
,z
和w
的地址。
这是允许的,但仅限于使用构造函数本身内的地址。因为当构造函数完成时,这些变量不再有效,因此,指向它们的指针指向无效的内存地址(你不知道那里有什么)。
您有两种选择:
new double
,并更改它们的值。查找refreneces
可能也不错。 我知道你正在尝试学习指针,但是对于这个应用程序,指针实际上并不是必需的。只会让事情变得更慢。 (虽然不多)。
答案 2 :(得分:0)
答案 3 :(得分:0)
当您尝试在Quaternion中传递值(double x,double y,double z,double w)时,您将获得值的地址。退出Quaternion(双x,双y,双z,双w)地址后,这些变量被清除掉了,你使用的不是你的记忆。