【问题标题】:Nested classes error in C++C ++中的嵌套类错误
【发布时间】:2016-05-02 08:32:50
【问题描述】:

作为初学者,我正在自学 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();
}

不知何故我得到了

错误:没有匹配的调用函数 '四边形::四边形(四边形::顶点)'

并坚持了一个下午。有人可以解释我的代码有什么问题吗?我知道我的构造函数有问题,但我无法修复它......

【问题讨论】:

  • 在发布有关构建错误的问题时,请包含 complete 错误输出,包括任何信息说明。错误消息很可能包含实际需要的所有信息,但由于我们无法看到所有信息,因此我们没有所有信息。因此,请编辑您的问题以包含完整的输出,完整且未经编辑,只需复制粘贴即可。
  • 当你在它的时候,请drop that using namespace std; ;)
  • 有点跑题:为什么vertexquadrangle 的嵌套类?会例如类triangle定义不同的顶点?
  • 调试技巧:简化。嵌套类可能会令人困惑,所以如果事情不正常,请尝试将嵌套类移动到全局范围。那不会解决这个问题,但它会为这个问题产生一个更好的标题。这不是对嵌套类使用的评论。看到外面移不影响问题后,可以放回里面了。

标签: c++ object compiler-errors inner-classes


【解决方案1】:

以下不是您所期望的:

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

它是一个构造函数,它接受一个返回顶点的函数并接受 2 int。 然后用未初始化的成员 ab 初始化成员顶点 p1。

你想要的很简单:

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

(并删除成员ab)。

【讨论】:

    【解决方案2】:

    你的错误说明了一切,你没有构造函数:

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

    【讨论】:

    • 你第二部分的东西确实是一个函数指针。函数参数声明中的函数类型衰减为指针,就像数组一样。 Live check
    • @Quentin 我不知道,谢谢
    猜你喜欢
    • 2018-06-07
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多