C++:关键字错误'this'

C++: Error with 'this' keyword

本文关键字:this 错误 关键字 C++      更新时间:2023-10-16

我正在尝试在 c++ 中创建一个 poptart 自动售货机程序,并且我正在尝试使用 this 关键字,但是我总是收到一条错误消息,指出"this"只能在非静态成员函数中使用。下面是我遇到一个此类问题的代码的一部分

法典:

#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:成员声明现在在构造函数外部进行

编辑3:添加了状态类声明

类定义代码如下:

#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);
};

this指针仅在类内有效。您的insertMoney函数未声明为在类中。请参阅 http://www.learncpp.com/cpp-tutorial/87-the-hidden-this-pointer/。

insertMoney的定义中(在代码中,而不是在类中),您不会将其声明为 hasCredit 的成员。您需要改用void hasCredit::insertMoney

您可能

希望将insertMoney附加到类。 尝试在定义中ClassName::insertMoney

错误准确地告诉您为什么得到它。

解决方案是修复要成为成员函数的定义,以便编译器知道它是成员函数。 喜欢这个:

//   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

有几点是错误的:

类定义:

#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);
}

该方法必须使用类的名称进行限定...否则它将被视为函数的定义...并且函数没有这个

相关文章: