C++ 如何使用继承找到两点之间的最小距离?

C++ 如何使用继承找到两点之间的最小距离?,c++,C++,我想使用Shape.cpp中的getDistanceTo()方法返回一个指向距离最小的对象的指针。但是我的findClosestTo()方法将被核心转储。 那么如何修复findClosestTo()方法呢 ShapeList.cpp Shape* ShapeList::findClosestTo (double p_x, double p_y) const{ Shape* distance = nullptr; for ( const auto& item : *this

我想使用Shape.cpp中的getDistanceTo()方法返回一个指向距离最小的对象的指针。但是我的findClosestTo()方法将被核心转储。 那么如何修复findClosestTo()方法呢

ShapeList.cpp

Shape* ShapeList::findClosestTo (double p_x, double p_y) const{
    Shape* distance = nullptr;
    for ( const auto& item : *this ) {
        double longest  = item->getDistanceTo(p_x, p_y);
        double previous = item->getDistanceTo(p_x, p_y);
        longest = item->getDistanceTo(p_x, p_y);
        if(previous > longest){
            distance = item;
        }
    }
    return distance;
}
形状学家

class ShapeList : protected std::list<Shape*> {
public:
    ShapeList( ) = default;
    ~ShapeList();
    void add( Shape* newShape );
    void write( std::ostream& strm_out ) const;
    void erase();
    Shape* findClosestTo (double p_x, double p_y) const;

    friend std::ostream& operator<<( std::ostream& strm_out, const ShapeList& shapes );
};

我看到一些问题。第一:

Shape* ShapeList::findClosestTo (double p_x, double p_y) const{
    Shape* distance = nullptr;
    for ( const auto& item : *this ) {
        double longest  = item->getDistanceTo(p_x, p_y);
        double previous = item->getDistanceTo(p_x, p_y);
        longest = item->getDistanceTo(p_x, p_y);
        if(previous > longest){
            distance = item;
        }
    }
    return distance;
}
此方法不起作用,因为每次循环时,longest和previous都具有相同的值。每次循环时都会计算它们。你需要稍微不同的逻辑。有十几种不同的方法可以做到这一点

我可以这样做:

Shape* ShapeList::findClosestTo (double p_x, double p_y) const{
    Shape* closest = nullptr;
    double distanceToClosest = 0;

    for ( const auto& item : *this ) {
        double distance  = item->getDistanceTo(p_x, p_y);
        if(closest == nullptr || distance < distanceToClosest) {
            closest = item;
            distanceToClosest = distance;
        }
    }
    return closest;
}
这是一种非常奇怪的计算到p_x距离的方法

试试这个。请注意,您没有向我们显示Shape.h,因此我假设:

double Shape::getDistanceTo (double p_x, double p_y) const{
    double deltaX = this->x - p_x;
    double deltaY = this->y - p_y;
    double distance = sqrt(deltaX * deltaX + deltaY * deltaY);
    return distance;
}
我不知道你的计算距离的方法是什么


我不知道你为什么还有其他麻烦,但我看到了。如果您进行了一些修复,那么请让我们知道您的代码看起来像什么以及它的核心转储在哪一行,这将有所帮助。

首先告诉我们它有什么问题。for语句上方的行
距离
有什么作用?由于没有终止分号,编译器将其视为…的
距离。为什么在
findClosestTo()中计算
最长的
两次?该声明计算并赋值。在定义
previous
之后,将使用相同的等式再次计算
最长的
。在相同的函数中,
longest
previous
使用完全相同的函数调用。比较应该总是相等的,除非浮点表示出现了奇怪的情况。我强烈建议不要从
std::list
继承。我建议将这个概念改为shapelist包含一个形状容器。换句话说,ShapeList有一个形状容器(也称为向量或列表)。
Shape* ShapeList::findClosestTo (double p_x, double p_y) const{
    Shape* closest = nullptr;
    double distanceToClosest = 0;

    for ( const auto& item : *this ) {
        double distance  = item->getDistanceTo(p_x, p_y);
        if(closest == nullptr || distance < distanceToClosest) {
            closest = item;
            distanceToClosest = distance;
        }
    }
    return closest;
}
distance = sqrt(p_x * ref_x + p_y * ref_y);
double Shape::getDistanceTo (double p_x, double p_y) const{
    double deltaX = this->x - p_x;
    double deltaY = this->y - p_y;
    double distance = sqrt(deltaX * deltaX + deltaY * deltaY);
    return distance;
}