c++ - 指向类实例的指针

标签 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;

问题是一个类的链接怎么变成指向这个类的构造函数的指针,如何解决?

最佳答案

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

关于c++ - 指向类实例的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51597805/

相关文章:

来自其他文件的c++类

c - 随机 "munmap_chunk()"和段错误

c++ - 将一个数组值指向同一数组的另一个值 - C++

c++ - linux 中的 wmain 或 _tmain 替代品是什么?

c++ - 我可以在头文件中定义宏吗?

c++ - 正确使用boost Lockguard——这两个是一样的吗

class - 用 actor 替换 class 关键字会导致错误

c++ - 无法使用合格枚举作为参数将类实例化为 LHS 值 (C++ VS2015)

c - 指针数组及其意义

c++ - 正确数据类型的输入验证?