我正在尝试在c ++中创建一个poptart自动售货机程序,我正在尝试使用这个关键字,但是我总是收到一个错误,说明这个'只能在非静态成员函数中使用。以下是我在
中遇到此类问题的代码的一部分代码:
#include <iostream>
#include "HasCredit.h"
using namespace std;
void insertMoney(int money)
{
cout<<"You inserted: " << money;
money = money+this->currentContext->getStateParam(Credit);
this->currentContext->setStateParam(Credit,money);
cout<< "Total: "<<money<<endl;
this->currentContext->setState(Has_Credit);
}
对于我收到此错误的原因的任何建议都将非常感激。欢呼声。
编辑:insertMoney方法位于名为HasCredit的类中。
Edit2:成员声明现在在构造函数之外进行
Edit3:添加了州级声明
类别定义代码如下:
#include <iostream>
#include "State.h"
#include "StateContext.h"
using namespace std;
class HasCredit: public State
{
HasCredit (StateContext* Context) : State(Context) {
}
void insertMoney(int);
void MakeSelectionCoating(int);
void MakeSelectionFilling(int);
void moneyRejected(void);
void addPopTarts(int);
void dispense(void);
};
状态类声明代码如下所示:
#include <iostream>
#include "Transition.h"
using namespace std;
class State: public Transition
{
protected:
StateContext* currentContext;
public:
State(StateContext* Context);
};
答案 0 :(得分:4)
this
指针仅在类中有效。您的insertMoney
函数未声明为类。请参阅http://www.learncpp.com/cpp-tutorial/87-the-hidden-this-pointer/。
在insertMoney
的定义中(在代码中,而不是类),您不会声明它是hasCredit
的成员。您需要改为使用void hasCredit::insertMoney
。
答案 1 :(得分:1)
您可能希望将insertMoney
附加到班级。在您的定义中尝试ClassName::insertMoney
。
答案 2 :(得分:1)
错误告诉您确切的原因。
解决方案是修复您打算成为成员函数的定义,以便编译器知道它是成员函数。像这样:
// vv THIS WAS MISSING
void HasCredit::insertMoney(int money)
{
...
问题中显示的成员声明也位于错误的位置。它们需要在类体内部,但在构造函数之外。覆盖虚拟成员函数时,您可能希望使用virtual
和override
关键字向读者显示该功能。 (注意,override
仅在您拥有新的C ++ 11编译器时才有效。对于较旧的编译器,请使用注释/* override */
代替
class HasCredit: public State
{
HasCredit (StateContext* Context) : State(Context) { }
// vv THIS....................CANNOT BE INSIDE HERE ^^
virtual void insertMoney(int) override;
...
};
您可能希望某些成员也是public
。
答案 3 :(得分:0)
有一些问题:
类定义:
#include <iostream>
#include "State.h"
#include "StateContext.h"
using namespace std;
class HasCredit: public State
{
HasCredit (StateContext* Context) : State(Context) {
}
void insertMoney(int);
void MakeSelectionCoating(int);
void MakeSelectionFilling(int);
void moneyRejected(void);
void addPopTarts(int);
void dispense(void);
};
请注意,方法应声明为构造函数定义的 。
实施:
#include <iostream>
#include "HasCredit.h"
using namespace std;
void HasCredit::insertMoney(int money)
{
cout<<"You inserted: " << money;
money = money+this->currentContext->getStateParam(Credit);
this->currentContext->setStateParam(Credit,money);
cout<< "Total: "<<money<<endl;
this->currentContext->setState(Has_Credit);
}
该方法必须使用类的名称进行限定...否则它将被视为函数的定义...并且函数没有 this