C ++:错误'这个'关键词

时间:2014-04-03 20:07:31

标签: c++

我正在尝试在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);
};

4 个答案:

答案 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)
{
    ...

问题中显示的成员声明也位于错误的位置。它们需要在类体内部,但在构造函数之外。覆盖虚拟成员函数时,您可能希望使用virtualoverride关键字向读者显示该功能。 (注意,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