C++ 为什么使用“返回成员变量”;这";不允许使用指针,但使用“设置成员变量”;这";允许吗?

C++ 为什么使用“返回成员变量”;这";不允许使用指针,但使用“设置成员变量”;这";允许吗?,c++,pointers,visual-c++,this,intellisense,C++,Pointers,Visual C++,This,Intellisense,以下是头文件代码: #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

以下是头文件代码:

#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
#ifndef(项目经理)__
#定义项目经理__
#包括
班级经理{
私人:
std::字符串类型;
布尔开始了;
受保护的:
void setType(标准::字符串类型);
公众:
经理();
虚拟管理器();
//获取类型标识符
std::string getType();
//启动管理器。0:启动正常。任何#:不正常。
虚拟int启动();
//关机管理器。
虚拟无效关机();
//True:启动执行正常。否则为False。
bool isStarted()常量;
};
#恩迪夫
下面的代码将错误显示为“指向绑定函数的指针只能用于调用该函数”

bool管理器::IsStart()常量{

返回此->isStarted;//您的名字搞乱了

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

在第二种情况下,您将
isStarted
的地址转换为bool,然后返回它(它将始终返回true!!)


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

,具体地说,您将
isStarted
化名为类中方法的名称,因此
this->isStarted
正试图返回指向成员方法的指针ode>Manager::isStarted
而不是一些布尔值
isStarted


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

这是允许的。错误与此无关:您使用了错误的变量名。或者,更具体地说,您将
IsStart
化名为类中某个方法的名称,因此
this->IsStart
正试图返回指向成员方法的指针
Manager::IsStart
而不是一些布尔值
被启动了
。因此,不工作的代码不工作是因为它没有做你认为它正在做的事情,而工作的代码工作是因为它没有做你认为它正在做的事情,因为返回的指针可以隐式转换为
bool
。我很愚蠢。很抱歉浪费了你的时间ime。对于那些投反对票的人,请停下来。我只想继续前进,反思这个错误。相反,我想请你们投票结束。谢谢你们的阅读。我很愚蠢。对不起浪费你们的时间。谢谢你们让我知道。这是我应得的。@tom_mai78101这没关系,发生在我们当中最好的人身上。隐式转换允许某些事情发生如果不是程序员的意图,是C++代码中无尽的bug的来源。不要感觉太糟糕。我感觉不好不是因为错误,而是问题现在是一个下注磁铁。我不能删除它,所以我最好的希望是别人把它标记为关闭。我不想再吸引更多的下票,即使我值得。我只是想要。ed继续。@tom_mai78101我真的很惊讶它能获得这么多的反对票。这是一个合理的问题,你当然提供了一个MCVE。最坏的情况下,人们应该投票选择打字错误,而不是反对票。
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.
}