C++ 中的构造函数重载问题

Constructor Overloading Issue in C++

// Create a function which takes 2 point objects and computes the distance between those points
#include<iostream>
#include<cmath>
using namespace std;

class dist{
    int x, y;    
public:
    dist(int a , int b) {
        x = a;
        y = b;
    }
    dist();
    void caldistance(dist c1, dist c2) {
        // c1 = (8,9) & c2 (10, 7)
        // sqrt((10-8)^2 + (7-9)^2)
        // sqrt((c2.a-c1.a)^2 + (c2.b-c1.b)^2)
        int res = sqrt(pow((c2.x-c1.x),2)+pow((c2.y-c1.y),2));
        cout << "The Distance between the points ( " << c1.x << "," << c1.y << ")"  << "("<< c2.x << "," << c2.y << ")" << " is : " << res << endl;
    }
};

int main() {
    dist P(8,9);
    dist Q(11,6);
    dist G;
    G.caldistance(P,Q);
    
    return 0;
}

根据我的说法,一旦我创建了一个 class dist 的新对象 G,它应该调用 class dist 的函数调用距离,但它显示错误和程序没有被执行

错误:/usr/bin/ld:/tmp/cc99m1Ky.o:在函数 main': try.cpp:(.text+0x5d): undefined reference to dist::dist() 中 collect2:错误:ld 返回了 1 个退出状态

定义构造函数为

        dist():x(0),y(0) {}

dist()只是一个声明,但是你还没有定义构造器。

由于你定义的构造函数需要两个int,编译器不会为你合成默认构造函数,所以最好将默认构造函数定义为用户自定义的默认构造函数(没有初始化列表)。如 dist() = default;

不过,请注意,在这种情况下,内置类型的成员没有初始值。因此,在默认构造函数中为内置类型的数据成员提供初始值被认为是更好的做法。 像这样:

dist(int val_x = 0, int val_y = 0) : x(val_x), y(val_y) {}

此构造函数将处理这两种情况。