Как получить доступ к параметру конструктора класса из другого параметра класса - PullRequest
1 голос
/ 31 марта 2020

БОРЬБА С АРГУМЕНТОМ КОНСТРУКТОРА C ++

Итак, я только что пришел из TS / JS / Py и пытаюсь понять концепции C ++. Но я борюсь с использованием параметра конструктора класса FOR для объявления значения по умолчанию для аргумента. Вот код, который я пытаюсь запустить:

double Phythagorean_Hypotenuse (int& a, int& b ) {
    return sqrt((a * a) + (b * b));
};

class Triangle {
    public:
      int a;
      int b;
      double c;
      Triangle(int a_param, int b_param, double c_param = Phythagorean_Hypotenuse(a_param, b_param)) {
            a = a_param;
            b = b_param;
            c = c_param;
      }
};

и внутри основной функции

Triangle mytri_1(10, 20);
std::cout << mytri_1.a << std:endl;

Но когда я пытаюсь запустить этот код, IDE выдает мне некоторые ошибки как

[Error] 'a_param' was not declared in this scope

или

[Error] call to 'Triangle::Triangle(int, int, double)' uses the default argument for parameter 3, which is not yet defined

Так, пожалуйста, может кто-нибудь, кто может исправить это, ответить на вопрос?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

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

class Triangle {
public:
    double a;
    double b;
    double c;

    Triangle(double a_param, double b_param, double c_param)
        : a{a_param},
          b{b_param},
          c{c_param}
    {}

    Triangle(double a_param, double b_param)
        : Triangle{a_param, b_param, Phythagorean_Hypotenuse(a_param, b_param)}
    {}
};

Live Demo


Несколько других заметок :

  • Конструкторы классов не имеют возвращаемого типа. Я изменил void Triangle(...) на Triangle(...)
  • Я использовал списки инициализации конструктора вместо присваивания в теле конструктора. Вероятно, нет никакой разницы для небольших примитивных значений, таких как int s или double s, но это хорошая привычка, которая может иметь большое значение для более сложных типов
  • int не делает смысл для типа c (или a или b в этом отношении). Стороны треугольника вряд ли будут целыми числами
  • Нет причин передавать параметры в Pythagorean_Hypotenuse по ссылке. Проще и быстрее передать их по значению
2 голосов
/ 31 марта 2020

Существуют некоторые проблемы, препятствующие компиляции кода, а именно:

  1. Конструкторы не имеют возвращаемого типа.
  2. double c_param = Phythagorean_Hypotenuse(a_param, b_param) недопустимо для параметра, a_param, b_param не будет распознан.

Рекомендовать изменить:

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

Вы можете сделать что-то вроде этого:

Рабочий образец

#include <iostream>
#include <cmath>

double Phythagorean_Hypotenuse (int& a, int& b ) {
    return sqrt((a * a) + (b * b));
};

class Triangle {
    public:
      int a;
      int b;
      double c; //should be double

      //initializer list is a good practice for member initialization
      Triangle(int a_param, int b_param) 
          : a(a_param), b(b_param), c(Phythagorean_Hypotenuse(a, b)) {} 
};

int main(){

    Triangle mytri_1(10, 20);
    std::cout << mytri_1.a << std::endl;
    std::cout << mytri_1.b << std::endl;
    std::cout << mytri_1.c << std::endl;
}

Выход:

10
20
22.3607
2 голосов
/ 31 марта 2020

Как указывает компилятор, другие аргументы конструктора недоступны в качестве параметров по умолчанию для аргумента c_param. Вместо того, чтобы использовать значения по умолчанию, просто перегрузите конструктор, включая тот, который принимает только 2 параметра. Этот конструктор может затем вызвать другой конструктор, который принимает все 3:

 // Constructor overload that accepts all 3 parameters
 Triangle(int a_param, int b_param, double c_param):
  a(a_param), b(b_param), c(c_param) {
  }

  // Constructor overload that accepts just a and b, call the other constructor
  // to set all 3 members
  Triangle(int a_param, int b_param):
  Triangle(a_param, b_param, Phythagorean_Hypotenuse(a_param, b_param)) {
  }
...