Получение неопределенной ошибки типа класса, но я создал класс и определил его - PullRequest
1 голос
/ 12 февраля 2010

Я работаю над заданием для одного из моих классов. Просто у меня есть класс GumballMachine и несколько классов State, которые меняют состояние GumballMachine.

Вот код нарушения:

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

Теперь, ниже, я определил свой класс 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;
};

Visual Studios выдавала ошибку C2259 и C2027, но после просмотра MSDN я чувствую, что все делаю правильно Может быть, я просто устал, но я не могу найти ошибку / посмотреть, что я сделал не так.

Большое спасибо за любую помощь. : D

Ответы [ 4 ]

6 голосов
/ 12 февраля 2010

Вы не можете получить доступ к членам 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.
}
1 голос
/ 12 февраля 2010

Крис, вам нужно принять более стандартный подход разделения объявлений на заголовочные файлы и определений на файлы модулей.

class State должно быть в чем-то вроде State.h, а такие вещи, как определение NoQuarterState::insertQuarter(), должны быть в State.cpp.

Когда это будет сделано, вы будете знать, какие файлы .cpp должны #include другие заголовочные файлы, чтобы они компилировались.

Вы вправе иметь class GumballMachine; до объявления class State, поскольку State и NoQuarterState должны знать, что имя .

1 голос
/ 12 февраля 2010

В классе GumballMachine отсутствует точка с запятой после определения.

0 голосов
/ 12 февраля 2010

class GumballMachine; объявляет класс. Если вы хотите разыменовать указатель на объект класса, вы должны сначала определить класс. Обычно это делается в заголовочных файлах. В определении класса должны быть объявлены все его функции-члены и переменные, но вы можете определять эти функции, где хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...