我自学C ++作为初学者,我遇到了一些关于嵌套类的问题。我试图为给定四个顶点(定义一个称为顶点的点)的四边形定义一个类,其中 由二维点的嵌套类的对象表示。我只用一点来测试我的答案。我对这个问题的回答是:
#include <iostream>
#include <assert.h>
using namespace std;
class quadrangle
{
public:
class vertex
{
private:
public:
int x, y;
friend class quadrangle;
vertex();
vertex(int a, int b);
vertex(const vertex & old);
};
vertex p1;
int a, b;
friend class vertex;
quadrangle();
quadrangle(vertex(int a, int b)) : p1(a,b) {};
quadrangle(const quadrangle & old);
void draw();
};
quadrangle::vertex::vertex()
{
x = 0; y = 0;
}
quadrangle::vertex::vertex(int a, int b)
{
x = a; y = b;
}
void quadrangle::draw()
{
cout << "p1: (" << p1.x << "," << p1.y << ") " << endl;
}
quadrangle::quadrangle()
{
p1.x = 0; p1.y = 0;
}
int main()
{
quadrangle q1(quadrangle::vertex(2,3));
q1.draw();
}
不知何故,我得到了
错误:没有匹配的调用函数 &#39;四边形::四边形(四边形顶点::)&#39;
并且已经停留了整整一个下午。有人可以解释我的代码中的错误吗?我知道我的构造函数有问题,但我无法修复它......
答案 0 :(得分:6)
以下不是您的期望:
quadrangle(vertex(int a, int b)) : p1(a,b) {};
它是一个构造函数,它接受一个函数返回顶点并取2 int
。
然后使用未经授权的成员a
和b
初始化成员顶点p1。
你想要的只是:
quadrangle(const vertex& v) : p1(v) {}
(并删除成员a
,b
)。
答案 1 :(得分:3)
你的错误告诉了所有,你没有构造函数:
quadrangle(const vertex & old);
并且需要进行初始化:
quadrangle q1(quadrangle::vertex(2,3));
这真的很奇怪:
quadrangle(vertex(int a, int b)) : p1(a,b) { }
它看起来像是一个构造函数采用函数原型(或函数类型?) - 但它不是函数指针我猜。 p1(a,b)
编译只是因为你的班级中有这样的变量。
[编辑]
来自昆汀的评论之后- 上面的声明是一个函数指针
函数参数中的函数类型&#39;声明衰减到指针
下面的示例显示了将函数指针编写为函数参数的各种方法:
std::string bar(int a, int b) {
std::cout << "bar";
return "";
}
void foo1(std::string(int a, int b)) { } // Unnamed function pointer
void foo2(std::string(pf)(int a, int b)) { pf(0,0); } // Named function pointer
void foo3(std::string(*pf)(int a, int b)) { pf(0,0);} // Named function pointer
int main() {
foo1(bar);
foo2(bar);
foo3(bar);
}