constructor.function (constructor) Как передать объект того же класса в функцию?

0

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

c1.overlaps(c2); ,

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

void overlaps(Circle &a)

Аргумент Circle &a будет ссылаться на Circle c2 сверху, но я не знаю, как будет проходить Circle c1 и его значение.

Вот код, который я написал:

#include <string>
#include <cmath>

using namespace std;

class Circle
{
    private:
        double x, y, radius;
    public:
        Circle(double &x, double &y, double &radius);
        {
            void overlaps(this);
        }
};

void overlaps(this)
{
    this -> c2;
    double x3 = c2.x;
    double y3 = c2.y;
    double rad3 = c2.radius;
    double z = pow(x3-x,2) + pow(y3-y,2);
    double r = sqrt(z);
    if(c2.radius + radius > r)
        cout<<"The circles overlap.\n";
    else
        cout<<"The circles do not overlap\n";
};

int main()
{
    double x1, x2, y1, y2, rad1, rad2;
    cin>>x1>>y1>>rad1;
    cin>>x2>>y2>>rad2;
    Circle c1 = new Circle(x1, y1, rad1);
    Circle c2 = new Circle(x2, y2, rad2);
    c1.overlaps(c2);
}
  • 3
    Это попытка создать функцию-член, но не очень хорошая. Пожалуйста, прочитайте соответствующую главу в вашей книге C ++, прежде чем продолжить!
  • 0
    В приведенном вами примере перекрытия являются функцией-членом Circle. Таким образом, вам нужно всего лишь пройти второй круг к первому. Функция перекрытия уже имеет доступ к данным первой.
Показать ещё 2 комментария
Теги:

1 ответ

0
Лучший ответ

Надеюсь, вы не указали вышеприведенный код на своем экзамене :)

По сути, функция void overlaps(Circle &a) должна быть функцией-членом в классе Circle.

Как вы упомянули в своем вопросе, при вызове c1.overlaps(c2) явный аргумент a будет использоваться в качестве ссылки на переменную c2.

И, как вы не упомянули в своем вопросе, при вызове c1.overlaps(c2) неявный аргумент *this будет использоваться в качестве ссылки на переменную c1 (хотя вам не нужно явно использовать ее).

Поэтому вы должны в основном определить класс Circle следующим образом:

class Circle
{
private:
    double x, y, radius;
public:
    Circle(double x, double y, double radius);
    bool overlaps(const Circle& a) const;
};

Затем вы должны реализовать overlaps функций следующим образом:

bool Circle::overlaps(const Circle& a) const
{
    double z = pow(a.x-x,2) + pow(a.y-y,2);
    double r = sqrt(z);
    return a.radius + radius > r;
};

Наконец, в функции main вы можете вызвать overlaps функций следующим образом:

int main()
{
    double x1, x2, y1, y2, rad1, rad2;
    cin>>x1>>y1>>rad1;
    cin>>x2>>y2>>rad2;
    Circle c1 = new Circle(x1, y1, rad1);
    Circle c2 = new Circle(x2, y2, rad2);
    if (c1.overlaps(c2))
        cout<<"The circles overlap.\n";
    else
        cout<<"The circles do not overlap\n";
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню