【问题标题】:Pointer to the class instance指向类实例的指针
【发布时间】:2018-07-30 15:50:32
【问题描述】:

我在命名空间中插入了一个类:

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;

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

【问题讨论】:

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


【解决方案1】:

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 答案中进行了讨论。

【讨论】:

  • “(错误地)”让我很好奇。根据 Wikipedia,Most vexing parse句法歧义解决 的术语,它可能与人类作家的期望/意图不符。 (不过,即使是维基百科也可能失败。)
  • @Scheff 我已经稍微修改了答案。
  • 所以,您认为A a() 没有这样的歧义,因为没有相应的答案。必须消除歧义的构造函数的(并发)语法规则?有一次,我成为养老金领取者,我将详细阅读 C++ 语法并检查一下。 (我将其添加到一旦我有时间我会做的事情列表中......)
  • @Scheff 这是我的想法,是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多