【问题标题】:Why returning a member variable using "this" pointer is not allowed, but setting a member variable using "this" is allowed?为什么不允许使用“this”指针返回成员变量,但允许使用“this”设置成员变量?
【发布时间】:2014-09-09 14:04:39
【问题描述】:

头文件代码如下:

#ifndef __MANAGER_H__PROJECT_A__
#define __MANAGER_H__PROJECT_A__

#include <string>

class Manager {
private:
    std::string type;
    bool isStarted;
protected:
    void setType(std::string type);
public:
    Manager();
    virtual ~Manager();

    //Get type identifier
    std::string getType();

    //Startup manager. 0: Startup ok. Any #: Not ok.
    virtual int startUp();

    //Shutdown manager. 
    virtual void shutDown();

    //True: startUp executed ok. False, otherwise.
    bool isStarted() const;
};

#endif

下面的代码将错误显示为“指向绑定函数的指针只能用于调用函数”。

bool Manager::isStarted() const {
    return this->isStarted;        //<----   ERROR.
}

应该改成这个。

bool Manager::isStarted() const {
    return Manager::isStarted;     //<----   Correct.
}

那么为什么这是可以接受的呢?

void Manager::setType(std::string type){
    this->type = type;             //<----   Correct.
}

提前致谢。

【问题讨论】:

  • 是允许的。错误无关:您使用了错误的变量名。
  • 或者,更具体地说,您已将 isStarted 别名为类中方法的名称,因此 this-&gt;isStarted 试图返回指向成员方法 Manager::isStarted 的指针而不是一些布尔值isStarted。所以你的代码不起作用,因为它没有做你认为它正在做的事情,你的代码起作用是因为它没有做你认为它正在做的事情,因为返回的指针可以隐式转换为@ 987654329@.
  • 我很愚蠢。很抱歉浪费了您的时间。
  • 投反对票的请停止。我只想继续前进,反思这个错误。相反,我想请你投票结束。感谢您阅读。

标签: c++ pointers visual-c++ this intellisense


【解决方案1】:

具体来说,您已将 isStarted 别名为类中方法的名称,因此 this-&gt;isStarted 试图返回指向成员方法 Manager::isStarted 的指针,而不是一些布尔值 isStarted .

所以你的代码不起作用,因为它没有做你认为它正在做的事情。你的代码可以工作,因为它也没有做你认为它正在做的事情;返回的指针可以隐式转换为bool(并且始终等于true),因此您不会收到错误的返回类型错误。

【讨论】:

  • 我很愚蠢。很抱歉浪费您的时间。谢谢你让我知道。我应得的。
  • @tom_mai78101 没关系,发生在我们最好的人身上。允许发生并非程序员意图的事情的隐式转换是 C++ 代码中无穷无尽的错误的来源。不要感觉太糟糕。
  • 我感觉不好不是因为错误,而是现在的问题是一个不受欢迎的磁铁。我无法删除它,所以我最大的希望是让其他人将其标记为已关闭。我不想吸引更多的反对票,即使我应得的。我只是想继续前进。
  • @tom_mai78101 我真的很惊讶它得到了如此多的反对票。这是一个合理的问题,您当然提供了 MCVE。在最坏的情况下,人们应该投票赞成不打错,而不是反对。
【解决方案2】:

你把名字弄乱了!!

isStarted 是成员函数的名称。因此,您的第一个示例是错误的。

第二个,你将isStarted的地址转换为布尔值,然后你返回它(它总是返回true!!)

在第三个中,您使用this 正确区分成员变量type 和形式变量type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2013-05-08
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多