Указатель C ++ неверное значение

Относительно новичок в 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

Куда я иду не так?

-2

Решение

Ваш код нарушает основные принципы управления необработанными указателями — вы не представляете, кому они принадлежат. Этот же указатель может быть выделенным объектом через new или просто адресом, указанным в конструкторе. Это делает владение этим невозможным — вы не можете писать операторы присваивания или конструкторы копирования (ваша текущая реализация неверна).

Более неотложная проблема заключается в том, что вы запоминаете адрес аргументов в конструкторе 4-double. Это является непосредственной причиной для висящего указателя и неопределенного поведения.

Если вы хотите научиться пользоваться указателями, вам нужно прочитать книгу об этом. Если вам просто нужно использовать семантику, похожую на указатель, используйте умные указатели.

2

Другие решения

Я почти уверен, что вы скомпилировали несколько предупреждений. В вашем конструкторе вы берете адрес четырех аргументов инициализатора x, y, z а также w,
Это разрешено, но только для использования адреса внутри самой функции конструктора. Потому что, когда функция конструктора завершена, эти переменные больше не действительны, и, следовательно, указатели на них указывают на неверный адрес памяти (вы больше не знаете, что там).

У вас есть два варианта:

  • не используйте указатели; в этом классе они вам не нужны. Копирование указателя занимает столько же работы, сколько и копирование двойного.
  • управляйте своими указателями самостоятельно. Создать четыре new doubles в вашем конструкторе, и измените их значение. Также может быть приятно посмотреть refreneces,

Я понимаю, что вы пытаетесь узнать об указателях, но для этих приложений указатели действительно не нужны. И только делать вещи медленнее. (Хотя и не сильно).

1

  1. у вас нет реализации setQ здесь
  2. Вы пытаетесь передать по значению и получаете адрес значения в
    Quaternion (двойной х, двойной у, двойной г, двойной ш)
0

Когда вы пытаетесь передать значение в кватернионе (double x, double y, double z, double w), вы получаете адрес значения. После выхода Quaternion (double x, double y, double z, double w) адреса, задействованные в этих переменных, очищаются, и вы используете не вашу память.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector