(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点时出错:
- "Call of overloaded 'Point(int)' is ambigous"
关于我读到的所有其他问题,要么不是同一个问题,要么除了带默认参数的构造函数之外还有一个默认构造函数,这会导致在创建不带参数的对象时使用哪个构造函数的歧义。
在我正在阅读的一本提高 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; }
我是这个网站的新手,在做了一些研究后我找不到与我类似的问题(有些问题看起来像我的但他们的代码不同)
基本上我想做的是用所有不同的颜色值表示帧缓冲区矩阵。我正在编写一个名为 "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点时出错:
- "Call of overloaded 'Point(int)' is ambigous"
关于我读到的所有其他问题,要么不是同一个问题,要么除了带默认参数的构造函数之外还有一个默认构造函数,这会导致在创建不带参数的对象时使用哪个构造函数的歧义。
在我正在阅读的一本提高 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; }