Почему моя функция мутатора ничего не устанавливает?Или мой конструктор? - PullRequest
0 голосов
/ 13 сентября 2018

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

Вот мой код:

point.cpp

public:

point()
{
    x = 0;
    y = 0;
}
point(double x, double y)
{
    x = x;
    y = y;
}
void set_x(double x)
{
    x = x;
}
void set_y(double y)
{
    y = y;
}
double get_x() const
{
    return x;
}
double get_y() const
{
    return y;
}
private:
double x;
double y;
};

Главная

point pointA;
double x,y;

cout << "Enter x value for point A: " << endl;
cin >> x;
pointA.set_x(x);
cout << "Enter y value for point A: " << endl;
cin >> y;
pointA.set_y(y);

point pointB(x,y);

cout << "X value for point A is: " << pointA.get_x() << endl;
cout << "Y value for point A is: " << pointA.get_y() << endl;
cout << "X value for point B is: " << pointB.get_x() << endl;
cout << "Y value for point B is: " << pointB.get_y() << endl;

Выход:

X value for point A is: 10
Y value for point A is: 10
X value for point B is: 3.18463e-314
Y value for point B is: 2.12199e-314

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

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Проблема, как уже было сказано другими, заключается в том, что ваша переменная-член имеет то же имя, что и параметр.

Взгляните на этот метод сам по себе.Он завершен и присваивает x самому себе.

void set_x(double x)
{
    x = x;
}

В вашем коде это double x скрывает внешнюю (с точки зрения функций) переменную x.

Я бы порекомендовал вам префиксные переменные-члены с m_или m (м для участника).Это позволит создавать уникальные имена и поможет вам распознавать и предотвращать такие проблемы.

void set_x(double x)
{
    m_x = x;
}

Теперь вы можете видеть, что параметр x назначен переменной-члену m_x.

В качестве альтернативы вы также можете обратиться к члену с тем же именем, используя указатель this, например:

void set_x(double x)
{
    this->x = x;
}
0 голосов
/ 13 сентября 2018

Давайте рассмотрим один конструктор, хотя проблема везде одна и та же

point(double x, double y)
{
    x = x;
    y = y;
}

x относится к параметру . Таким образом, вы назначаете параметр для себя. Возможны два с половиной решения:

  1. Используйте разные имена для членов и параметров.
  2. Явно назовите члена с this, т.е. this->x = x;.
  3. Только для c'tor. Используйте список инициализатора члена, point(double x, double y) : x(x), y(y) {}. Здесь есть специальные правила о том, что x упоминается внутри и снаружи инициализатора. Я рекомендую вам использовать список инициализаторов, даже если вы принимаете одно из предыдущих решений. Это более идиоматический C ++.
...