C++中的嵌套类错误

3

作为初学者,我正在自学C++,在嵌套类方面遇到了一些问题。我试图定义一个类来表示由四个顶点(定义一个名为vertices的点)组成的四边形,该类由一个表示二维点的嵌套类对象表示。我只使用一个点来测试我的答案。我的答案是:

#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();
}

我遇到了一个问题:

错误:没有符合调用“quadrangle::quadrangle(quadrangle::vertex)”的函数

我已经卡了整个下午了。有人能解释一下我的代码哪里出错了吗?我知道我的构造函数有问题,但是我就是无法修复它...


发布有关构建错误的问题时,请包括完整的错误输出,包括任何信息注释。最可能的情况是错误消息包含了实际所需的所有信息,但由于我们无法完全看到它们,因此我们没有全部信息。因此,请编辑您的问题,以包括完整的输出,完整和未经编辑的,只需复制粘贴即可。 - Some programmer dude
你在编程的时候,如果可以的话,请省略掉 using namespace std; 这行代码。 :) - Quentin
略微偏题:为什么vertexquadrangle的嵌套类?例如,triangle类是否定义了不同的顶点? - VolkerK
一个调试技巧:简化。嵌套类可能会让人感到困惑,所以如果出现问题,请尝试将嵌套类移动到全局范围内。这并不能解决问题,但它可以为这个问题提供更好的标题。这并不是对使用嵌套类的评论;在看到将其移动到外部没有影响问题后,您可以将其放回内部。 - Pete Becker
2个回答

6
以下内容不是您预期的:

quadrangle(vertex(int a, int b)) : p1(a,b) {};

这是一个构造函数,它接受一个返回顶点并带有2个int参数的函数。然后,您使用未初始化的成员变量ab来初始化成员顶点p1

您需要的只是:

quadrangle(const vertex& v) : p1(v) {}

(并删除成员ab。)

3

你的错误已经说明了问题,你没有构造函数:

 quadrangle(const vertex & old);

需要进行以下初始化:

 quadrangle q1(quadrangle::vertex(2,3));

这真的很奇怪:

quadrangle(vertex(int a, int b)) : p1(a,b) { }

看起来这是一个构造函数,它采用了一个函数原型(或者函数类型?) - 但我猜它不是一个函数指针。只有因为你的类中有这样的变量,p1(a,b)才能编译。

[编辑]

根据Quentin的评论 - 上面的声明是一个函数指针

函数参数声明中的函数类型会衰减为指针

下面的例子展示了各种写函数指针作为函数参数的方式:

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

1
你第二部分提到的东西确实是一个函数指针。函数类型在函数参数声明中会衰减为指针,就像数组一样。在线检查 - Quentin
@Quentin 我不知道,谢谢。 - marcinj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接