指向类实例的指针

时间:2018-07-30 15:50:32

标签: c++ class pointers hyperlink function-pointers

我想将一个类插入名称空间:

namespace CPGL
{
    class Application;
}

class Application
{
    public:

        Application()
        {
            ...
        }
};

当我尝试创建指针时,此类如下:

CPGL::Application application();
CPGL::Application* app = &application;

奇怪而神秘的事情开始发生。这是编译日志:

error: cannot convert ‘CPGL::Application (*)()’ to ‘CPGL::Application*’ in initialization
CPGL::Application* app = &application;

问题是,到该类的链接如何变成指向该类的构造函数的指针以及如何解决?

1 个答案:

答案 0 :(得分:3)

CPGL::Application application();是一个函数声明,因此编译器诊断显示CPGL::Application (*)()

CPGL::Application application();
CPGL::Application* app = &application;

表达式&application在这里是一个函数指针。有时(错误地)将此错误称为The most vexing parse

您可能想要的是

CPGL::Application application;
CPGL::Application* app = &application;

还要注意,您的命名空间声明了一个类Application,但它是在命名空间之外定义的。这可能是问题的错字,也可能不是错字。

我不想将其描述为最令人讨厌的解析,因为没有语法规则可以合理地允许它作为对构造函数的调用。 type name();是一个函数声明,句点。 A a(object of type B)是调用构造函数A::A(B b)的正确方法。因此,有理由认为A a(B())创建了一个类型B的对象作为A ctor的参数。相反,编译器将其解析为类型。在链接的SO答案中对此进行了讨论。