获取未定义的类类型错​​误,但我确实创建了类并定义了它

1 c++ visual-studio-2008 visual-studio visual-c++

我正在为我的一个班级工作.简单地说,我有一个GumballMachine类和一组改变GumballMachine状态的State类.

这是违规代码:

class GumballMachine;

class State {
public:
 virtual void insertQuarter() const = 0;
 virtual void ejectQuarter() const = 0;
 virtual void turnCrank() const = 0;
 virtual void dispense() const = 0; 

protected:
 GumballMachine *GBM;
};

class NoQuarterState : public State {
public: 
 NoQuarterState (GumballMachine *GBM) {
  this->GBM = GBM;  
 }

 void insertQuarter() const {
  cout << "You inserted a quarter\n";  
  **this->GBM->QuarterInserted();** // <--- C2027 error on MSDN  
 }
};
Run Code Online (Sandbox Code Playgroud)

现在进一步下面我将GumballMachine类定义为:

class GumballMachine {
public:
 GumballMachine(int numOfGB) {
  this->noQuarterState = new NoQuarterState(this);
  this->soldOutState = new SoldOutState(this);
  this->hasQuarterState = new HasQuarterState(this);
  this->soldState = new SoldState(this);
  this->winnerState = new WinnerState(this);
  this->count = numOfGB;
  if (0 < numOfGB) {
   this->state = this->noQuarterState;
  }
  else {
   this->state = this->soldOutState;
  }  
 }

        ... more code ...

 void QuarterInserted() {
  this->state = this->hasQuarterState;
 }

 ... more code ...

protected:
 int count;
 NoQuarterState *noQuarterState;
 SoldOutState *soldOutState;
 HasQuarterState *hasQuarterState;
 SoldState *soldState;
 WinnerState *winnerState;
 State *state;
};
Run Code Online (Sandbox Code Playgroud)

视觉工作室抛出C2259和C2027错误,但在查看MSDN后,我觉得我做得对.也许我只是累了,但我似乎无法找到错误/看到我做错了什么.

非常感谢任何帮助.:d

Man*_*uel 6

GumballMachine在定义类之前,您无法访问任何成员,因此您必须将文件拆分为多个文件,每个文件包含一个类,或者NoQuarterState::insertQuarter在定义GumballMachine类之后定义方法:

class NoQuarterState : public State {
  public: 
    NoQuarterState (GumballMachine *GBM) {
       this->GBM = GBM;  
    }

    void insertQuarter() const; // Declaration only
};

class GumballMachine {
  public:
    ...
};

void NoQuarterState::insertQuarter() const {
  cout << "You inserted a quarter\n";  
  this->GBM->QuarterInserted(); // Works now bec. comp. has seen the def.
}
Run Code Online (Sandbox Code Playgroud)