【问题标题】:Why won't this c++ code compile?为什么这个 c++ 代码不能编译?
【发布时间】:2011-08-02 19:17:25
【问题描述】:

看到我是 C++ 新手,我想我会尝试编写一个非常简单的控制台应用程序来填充二维数组并显示其内容。

但我编写的代码无法编译。

我得到的一些错误是:

错误 C2065:'box':未声明的标识符
错误 C2228:'.GenerateBox' 左侧必须有类/结构/联合

这是我的代码:

#include <iostream>
using namespace std;

int main()
{
  Box box;
  box.GenerateBox();
}

class Box
{
private:
  static int const maxWidth = 135;
  static int const maxHeight = 60; 
  char arrTest[maxWidth][maxHeight];

public:
    void GenerateBox()
    {
      for (int i=0; i<maxHeight; i++)
        for (int k=0; k<maxWidth; k++)
        {
          arrTest[i][k] = 'x';
        }

      for (int i=0; i<maxHeight; i++)
      {
        for (int k=0; k<maxWidth; k++)
        {
          cout << arrTest[i][k];
        }
           cout << "\n";
      }
    }
};

知道是什么导致了这些错误吗?

【问题讨论】:

  • +1 用于包含直接从源代码复制粘贴的完整示例程序。在sscce.org 了解为什么这很重要。
  • @Rob: +1 推荐阅读网站:)

标签: c++ visual-c++


【解决方案1】:

C++ 编译器从上到下一次读取源文件。您已经在底部、main() 之后、您尝试使用该类的部分之后描述了 Box 类。因此,当编译器到达您说“Box box;”的部分时,它还没有看到类定义,因此不知道“Box”是什么意思。

【讨论】:

  • 如果他使用指针,则可以使用 Box 的预声明使其与下面的框定义一起使用。但在这种情况下没有这样的运气。
【解决方案2】:

main 函数移至代码底部。具体来说,你需要在引用之前定义Box

您可以只使用前向声明(即class Box;)的唯一情况是您只使用Box 作为指针或引用。

【讨论】:

  • 但是如果您使用前向声明,请确保您记得稍后定义 Box 类,否则当您的代码尝试使用该类时会出现运行时异常
  • 并非如此。前向声明允许您的代码将对象视为通用指针。您将无法调用任何成员函数。实际实例化对象或调用其函数的代码需要有完整的声明,否则将无法编译。
【解决方案3】:

您必须在使用之前定义 Box。因此,对于您的小型测试,您可以将您的类定义放在主要测试之前。

对于更大的程序,您将把您的类定义放在您将包含在源文件顶部的 .h 头文件中。

【讨论】:

  • 他必须“定义”类,而不仅仅是声明它。
  • true..“由于历史原因,类定义通常被称为类声明”但它不正确
  • @Nikko:更糟糕的是,每个定义都是一个声明,所以在技术上是正确的,但将类定义称为类声明非常无益。
【解决方案4】:

是由于 main() 的预先声明。在声明类 Box 之后使用 main。

【讨论】:

    【解决方案5】:

    @nikko 是对的。您必须在使用 Box 类之前声明它。通过任一

    • 剪切粘贴声明
    • 或者告诉编译器你稍后会声明它们

    尝试这个
    extern class Box;
    //use box class here
    //then define it later as you wish
    

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 2014-03-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      相关资源
      最近更新 更多