Можно ли реализовать функцию из другого класса в отдельную функцию класса - PullRequest
0 голосов
/ 21 марта 2020

В Line.h у меня есть класс Line и функция publi c под названием length(), которая измеряет расстояние между всеми точками в векторе (в частности, points[10]).

В Point.h, у меня есть функция с именем distance(), которая измеряет расстояние между двумя точками на графике.

Можно ли использовать функцию distance() внутри length() для измерения сумма расстояния между каждой точкой?

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

//Line.cpp
#include "Point.h"
#include "FloatCompare.h"
#include "Line.h"
#include <stdexcept>


//default constructor
Line::Line(){
    this->index = 0;
}

//destructor
Line::~Line(){
}


/**
 * Add a point to the end of our line. If the line contains
 * ten points then throw an out_of_range exception.
 */
/**
 *
if index == 10 then
  throw out-of-range exception
else
  point[index] = p argument
  index++ **/

void push_back(const Point& p){
    unsigned int index =0;
    Point points[10];
    if (index == 10){
        throw std::out_of_range ("Out of range.");}
    else {
        points[index] = p;
        index++;}
    }

/**
 * Clear the list of points
 */
void clear(){
    unsigned int index = 0;
}

/**
 * Return the length of the line. The length is calculated as
 * the sum of the distance between all points in the line.
 */

//this is where I am having my issues.
    double length(){
        float total = 0.0;
        Point points[10];
        for (unsigned int index = 0;index < 10; index++){
            total += Point distance(points &index);
        }
        return total;
    }

Line.h содержит конструкторы для Line.cpp

/*
 * Line.h
 *
 */

#ifndef LINE_H_
#define LINE_H_

#include "Point.h"

class Line {
public:
    /**
     * Constructor and destructor
     */
    Line();
    virtual ~Line();

    /**
     * Add a point to the end of our line. If the line contains
     * ten points then throw an out_of_range exception.
     */
    void push_back(const Point& p);

    /**
     * Clear the list of points
     */
    void clear();

    /**
     * Return the length of the line. The length is calculated as
     * the sum of the distance between all points in the line.
     */
    double length();

private:
    unsigned int index;
    Point points[10];

};

#endif /* LINE_H_ */

У меня такое ощущение, что я могу ошибаться, и мне, вероятно, не нужно вызывать функцию distance(). Пожалуйста, дайте мне знать, если мне нужно включить любой другой код, .h или .cpp файлов.

Редактировать - вот файлы Point.h и Point. cpp

Point .h

#ifndef POINT_H_
#define POINT_H_

#include <iostream>

class Point {
public:
    /**
     * Constructor and destructor
     */
    Point();
    Point(const double x, const double y);
    virtual ~Point();

    /**
     * Get the x value
     */
    double getX() const;

    /**
     * Get the y value
     */
    double getY() const;

    /**
     * Return the distance between Points
     */
    double distance(const Point &p) const;

    /**
     * Output the Point as (x, y) to an output stream
     */
    friend std::ostream& operator <<(std::ostream &out, const Point &point);

    /**
     * Declare comparison relationships
     */
    friend bool operator ==(const Point &lhs, const Point &rhs);
    friend bool operator <(const Point &lhs, const Point &rhs);

    /**
     * Declare math operators
     */
    friend Point operator +(const Point &lhs, const Point &rhs);
    friend Point operator -(const Point &lhs, const Point &rhs);

    /**
     * Copy constructor
     */
    Point(const Point& t);

    /**
     * Copy assignment
     */
    Point &operator =( const Point& rhs );

private:
    double x;
    double y;
};

#endif /* POINT_H_ */

Точка. cpp

#include "Point.h"
#include "FloatCompare.h"
#include "Line.h"
#include <cmath>

/** default constructor **/
Point::Point(){
    // TODO Auto-generated constructor stub
    this->x = 0.0;
    this->y = 0.0;
}

//Overloaded Constructor
Point::Point(const double x, const double y){
    // TODO Auto-generated constructor stub
    this->x = x;
    this->y = y;
}


/**
* Copy constructor */

    Point::Point(const Point & t){
            x = t.x;
            y = t.y;
        }

    //Default destructor
    Point::~Point() {
        // TODO Auto-generated destructor stub

    }


    //Retrieve X value
    double Point::getX() const {
        return x;
    }

    //Retrieve Y value
    double Point::getY() const {
        return y;
    }

    //Function for finding distance between 2 points on a graph. Using ((x-p.x)^2+(y-p.y)^2)^1/2
    double Point::distance(const Point &p) const{

        return sqrt( pow((x - p.getX()),2) + pow((y - p.getY()),2));

    }
    /**
     * Output the Point as (x, y) to an output stream
     */

    std::ostream& operator <<(std::ostream &out , const Point &point){
        out <<'(' << point.x << ',' << ' ' << point.y << ')';
        return out;
    }

    /**
     * Declare comparison relationships
     */

    //Equal to
    bool operator ==(const Point &lhs, const Point &rhs){
        return essentiallyEqual(lhs.getX(), rhs.getX()) && essentiallyEqual(lhs.getY(), rhs.getY());
    }

    //Comparison less than
    bool operator <(const Point &lhs, const Point &rhs){

        //P1 < P2 if P1.x < P2.x || (P1.x == P2.x && P1.y < P2.y).
        return definitelyLessThan(lhs.getX(), rhs.getX()) || (essentiallyEqual(lhs.getX(), rhs.getX()) && definitelyLessThan(lhs.getY(), rhs.getY()));
    }
    /**
     * Declare math operators
     */

    //Addition Operator
    Point operator +(const Point &lhs, const Point &rhs){

        return Point(lhs.x + rhs.x, lhs.y + rhs.y);
    }

    //Subtraction Operator
    Point operator -(const Point &lhs, const Point &rhs){

        return Point(lhs.x - rhs.x, lhs.y - rhs.y);
    }

    /**
    * Copy assignment
    */
    Point & Point::operator =(const Point& rhs){

        x= rhs.x;
        y= rhs.y;
        return *this;
        }

1 Ответ

0 голосов
/ 21 марта 2020

Почти весь ваш файл Line.cpp закодирован неправильно.

В определениях push_back(), clear() и length() отсутствуют обязательные Line:: квалификаторы.

У вас есть локальная переменная с именем points[] в push_back() и length() и локальная переменная index в push_back() и clear(), которые скрывают членов класса с одинаковыми именами. Вам нужно избавиться от этих локальных переменных.

Но, самое главное, синтаксис, который вы используете для вызова distance() внутри length(), совершенно неверен. distance() - это нестатический c метод Point, который принимает один Point в качестве ввода. Это означает, что вам нужно взять Point объект из массива points[] и вызвать distance() для него, передав ему следующий Point объект из того же массива.

Кроме того, ваш l oop внутри length() повторяется слишком много раз. Например, если в линию вставлено только 5 точек, вы перебираете все 10 элементов массива.

Попробуйте вместо этого:

//Line.cpp
#include "Point.h"
#include "FloatCompare.h"
#include "Line.h"
#include <stdexcept>

//default constructor
Line::Line(){
    index = 0;
}

//destructor
Line::~Line(){
}

/**
 * Add a point to the end of our line. If the line contains
 * ten points then throw an out_of_range exception.
 */
/**
 *
if index == 10 then
    throw out-of-range exception
else
    point[index] = p argument
    index++ **/

void Line::push_back(const Point& p){
    if (index == 10){
        throw std::out_of_range ("Out of range.");
    }
    points[index] = p;
    index++;
}

/**
 * Clear the list of points
 */
void Line::clear(){
    index = 0;
}

/**
 * Return the length of the line. The length is calculated as
 * the sum of the distance between all points in the line.
 */
double Line::length(){
    double total = 0.0;
    for (unsigned int i = 1; i < index; i++){
        total += points[i-1].distance(points[i]);
    }
    return total;
}
...