(C++)构造函数,默认参数,"call of overloaded... ambigous"

(C++) Constructor, default parameters, "call of overloaded... ambigous"

我是这个网站的新手,在做了一些研究后我找不到与我类似的问题(有些问题看起来像我的但他们的代码不同)

基本上我想做的是用所有不同的颜色值表示帧缓冲区矩阵。我正在编写一个名为 "Point" 的 class,我有一个构造函数,使用默认参数,这里是:

Point.h

#ifndef POINT_H
#define POINT_H
#include <iostream>



class Point
{
    protected:
        int x;
        int y;

    public:
        Point(int=0,int=0);
        Point(const &Point);
        void showC() const;
        static void showC(Point);
        virtual ~Point();


};

#endif // POINT_H

Point.cpp

#include "Point.h"

using namespace std;

Point::Point(int a,int b)
{
    x=a;
    y=b;
}

Point::~Point()
{}

void Point::showC() const
{ cout << x << " " << y << endl; }


void Point::showC(Point P)
{ cout << P.x << " " << P.y << endl; }

但问题是当我尝试编译程序时

main.cpp

#include <iostream>
#include "Point.h"



using namespace std;

int main()
{
 Point P1;
 Point P2(2);
 Point P3(4,-7);
 cout << "Call of function member showC\n";
 P1.showC();
 P2.showC();
 P3.showC();
cout << "Call of static function showC\n";
Point::showC(P1);
Point::showC(P2);
Point::showC(P3);

    return 0;
}

创建P2点时出错:

关于我读到的所有其他问题,要么不是同一个问题,要么除了带默认参数的构造函数之外还有一个默认构造函数,这会导致在创建不带参数的对象时使用哪个构造函数的歧义。

在我正在阅读的一本提高 C++ 技能的书中,有这个示例以某种方式起作用,这就是我不太理解的原因

这是示例:

main.cpp

class point
{
private :
int x;
int y;

Point (int abs=0, int ord=0) //inline constructor
 {x=abs; y=ord;}

bool coincide(point);

};

    bool point::coincide(point pt)
{ return ( (pt.x==x) && (pt.y==y) );
} 

int main()
{
point a, b(1), c(1,0);
cout << "a and b : " << a.coincide(b) << " ou " b.coincide(a) << "\n"
cout << "b et c : " << b.coincide(c) << " ou " << c.coincide(b) << "\n"
}

但是他将 main.cpp 文件中的所有内容分组,并且他的构造函数是内联的。

任何人都可以向我解释为什么示例有效,为什么我的程序无效?我想有一个我不明白的机制......

提前致谢

重新编辑:我复制了所有代码

我认为您混合了 python 和 C++ 创建 class

的方式

python 做使用 : class 点:

为了在 class 中声明,c++ 使用 {} 就像 class Point {}; 下面通过更改 class 声明来工作。

刚刚在你的构造函数中添加了一个 cout

#include <iostream>
#include <vector>
using namespace std;

class Point
{
private:
    int x;
    int y;


public:
    Point(int=0,int=0);
};

Point::Point(int a, int b)
{
    x = a;
    y = b;
    cout<<x<<y<<endl;
}

int main()
{
    Point P1;
    Point P2(2);
    Point P3(4,-7);
    return 0;
}

输出

00
20
4-7
Program ended with exit code: 0

问题编辑后 删除了你的越野车线,它完美地工作

Point(const &Point);

#include <iostream>
#include <vector>
using namespace std;

class Point
{
protected:
    int x;
    int y;

public:
    Point(int=0,int=0);
    //Point(const &Point);
    void showC() const;
    static void showC(Point);
    virtual ~Point();


};
Point::Point(int a,int b)
{
    x=a;
    y=b;
}

Point::~Point()
{}

void Point::showC() const
{ cout << x << " " << y << endl; }


void Point::showC(Point P)
{ cout << P.x << " " << P.y << endl; }

int main()
{
    Point P1;
    Point P2(2);
    Point P3(4,-7);
    cout << "Call of function member showC\n";
    P1.showC();
    P2.showC();
    P3.showC();
    cout << "Call of static function showC\n";
    Point::showC(P1);
    Point::showC(P2);
    Point::showC(P3);

    return 0;
}

输出

Call of function member showC
0 0
2 0
4 -7
Call of static function showC
0 0
2 0
4 -7
Program ended with exit code: 0

编辑后我想你想使用复制构造函数只需将其更改为

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