(C ++)构造函数,默认参数,“调用重载...暧昧”

时间:2017-08-05 14:39:41

标签: c++ inline default-constructor ambiguous

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

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

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;
}

创建Point P2时出错:

  • “调用重载'Point(int)'是暧昧的”

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

在我正在阅读的一本关于提高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文件中,并且他的构造函数是内联的。

任何人都可以向我解释为什么样本有效,为什么我的程序没有?我想有一种我不明白的机制......

提前致谢

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

1 个答案:

答案 0 :(得分:0)

我认为你正在混合创建类

的python和c ++方式

python使用: 类Point:

用于在课堂上声明,c ++使用{},如类Point {}; 下面通过更改类声明来实现。

刚刚在构造函数中添加了一个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; }