【问题标题】:C++ Using the "this" pointer as a normal pointerC++ 使用“this”指针作为普通指针
【发布时间】:2013-04-26 01:55:56
【问题描述】:

我目前正在尝试使用“this”指针将指针传递给函数:

void GameObject::process_events()
{
    std::vector<ObjectEvent*>::iterator it;
    for (it = events.begin(); it != events.end(); it++)
        (*it)->process(this);
}

Class ObjectEvent
{
private:
    bool* trigger;
    void (*response)(GameObject*);
public:
    process(GameObject* obj)
    {
        if (*trigger)
            response(obj);
    }
};

但我得到一个错误:

No matching function call to 'ObjectEvent::process(GameObject* const)'

可能是什么问题?

【问题讨论】:

  • 是的,this 是一个普通的指针。但是,您列出的功能不会给出该错误。请创建一个Short, Self Contained, Correct (Compilable), Example
  • 好的,我会输入我的真实代码,一秒钟
  • 如果这是真正的代码,它看起来不错。确定那里没有 const 吗?只是为了未来的读者。
  • 对我来说看起来像是一个编译器错误。通常可以复制 const 的可复制对象(除非有人搞砸了复制构造函数,这里不是这种情况)。 GameObject* 应该从 this 初始化,它的类型是 GameObject* const,除非从 const 成员尝试,但情况并非如此。实际上,您的代码应该可以工作。你说这并不意味着你使用的编译器是垃圾......或者你很困惑。后者的可能性更大。
  • 这不是您的真实代码,也不是 SSCCE。 Class 是一个死的赠品,事实上你有没有返回类型的函数。 Somehow, I feel like you failed to understand the importance of an SSCCE

标签: c++ pointers this


【解决方案1】:

从您的错误消息来看, process_events() 似乎实际上是一个 const 函数。

void GameObject::process_events() const
{
    process(this);
}

如果是这样,那么 this 是一个 const 指针,并且 process() 必须采用 const GameObject *。否则 process() 可能会修改传递给它的点,这违反了 process_events 不修改 this 的承诺。

void process(const GameObject* obj);

或者,从 process_events() 中删除 const 修饰符。

【讨论】:

  • 是的,你是对的,我的头文件是错误的,我一直在尝试修复 .cpp 文件。谢谢。
【解决方案2】:

如果您从其中返回this 或在其中使用this 的成员函数是const,那么它将是一个const 指针。如果成员函数没有声明 const,则指针也不会声明。

void GameObject::process_events()
{
    // ...
    process(this); // 'this' is NOT a const pointer
}

void GameObject::process_events() const
{
    // ...
    process(this); // 'this' IS a const pointer
}

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多