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

Posted

技术标签:

【中文标题】出现未定义的类类型错​​误,但我确实创建了类并定义了它【英文标题】:Getting undefined class type error but I did create the class and defined it 【发布时间】:2010-02-12 08:16:00 【问题描述】:

我正在为我的一门课做作业。简单地说,我有一个 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  
 
;

现在在下面我将我的 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

【问题讨论】:

您可能不应该养成将this-&gt; 放在所有内容前面的习惯;很混乱。 【参考方案1】:

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

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.

【讨论】:

这只是类声明,编译器需要查看整个内容(定义)才能编译访问成员的任何代码类(否则它无法知道这些成员是否实际存在或者它们是否具有所需的签名/类型) 类的所有内容似乎都可以编译,但现在当我尝试使用 GumballMachine *GBM = new GumballMachine(5) 创建类时出现链接器错误。我在类外创建的函数的所有定义上都得到了 LNK2001 未解析的外部变量。 LNK2001 的 MSDN 页面是压倒性的。你知道现在发生了什么吗? 您是否将成员函数定义放在定义类的同一命名空间中? 我是。我的老师说我可以只使用一个文件来完成作业。 以下编译和链接正常:codepad.org/TxDY5e4B。看看你的例子有什么不同。【参考方案2】:

GumballMachine 类在其定义后缺少分号。

【讨论】:

也许你看到了一些我没有看到的东西,但我看到(我想我看到了)我在分号中加上了。 class GumballMachibne //成员,方法 vs. ;最后一个分号不见了。 我认为克里斯是正确的。分号位于问题中代码 sn-p 的最后一行。【参考方案3】:

克里斯,您需要采用更标准的方法,将声明拆分为头文件,将定义拆分为模块文件。

class State 需要在 State.h 中,NoQuarterState::insertQuarter() 的定义需要在 State.cpp 中。

完成后,您将知道哪些 .cpp 文件需要 #include 其他头文件才能编译。

class State 声明之前拥有class GumballMachine; 是正确的,因为StateNoQuarterState 都需要知道名称

【讨论】:

【参考方案4】:

class GumballMachine; 声明类。如果您希望取消引用指向该类对象的指针,您必须首先定义该类。这通常在头文件中完成。在类定义中必须声明它的所有成员函数和变量,但是你可以在任何你喜欢的地方定义这些函数。

【讨论】:

以上是关于出现未定义的类类型错​​误,但我确实创建了类并定义了它的主要内容,如果未能解决你的问题,请参考以下文章

什么体现了类的多态性?

jni报错日志打印方法未定义

错误说“相机未定义”,但我确实定义了它

__autoload()不执行报错的解决办法

ES6中的类

ES6中的类