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.
}