为什么这段C++代码无法编译?

4

我是新手,对C++不太熟悉。因此,我尝试编写一个非常简单的控制台应用程序,用以填充2D数组并显示其内容。

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

其中一些错误如下:

error C2065: 'box' : 未声明的标识符
error 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";
      }
    }
};

有什么想法导致这些错误吗?


2
请包括一个完整的示例程序,直接从您的源代码中复制粘贴。了解为什么这很重要,请访问http://sscce.org/。 - Robᵩ
1
@Rob:+1 非常好的阅读网站参考 :) - Draco
5个回答

8

C++ 编译器从顶部到底部一次性读取源文件。你在 main() 函数后面,在你尝试使用 Box 类的那部分代码之后,才描述了 Box 类。因此,当编译器到达你说“Box box;”这部分代码时,它还没有看到类的定义,因此不知道“Box”是什么意思。


如果他使用指针,可以使用Box的预声明使其与下面的box定义配合使用。但在这种情况下没有这样的运气。 - James Matta

6

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

唯一可以仅使用前向声明(即class Box;)而不定义类的情况是当您只将Box用作指针或引用时。


1
但如果您使用前向声明,请确保稍后定义Box类,否则当您的代码尝试使用该类时,将会出现运行时异常。 - Dr Deo
3
并不完全如此。前置声明使得代码可以将对象视为通用指针,但无法调用任何成员函数。实际实例化对象或调用其函数的代码需要具有完整的声明,否则将无法编译。 - EboMike

5

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

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


2
他必须“定义”类,而不仅仅是声明它。 - sinek
为了历史原因,类定义通常被称为类声明,但这是不正确的。 - Nikko
@Nikko:更糟糕的是,每个定义都是一个声明,因此将类定义称为类声明在技术上是正确的,但并不是很有帮助。 - Steve Jessop

2
由于main()的预先声明,导致了这个问题。请在Box类的声明之后再使用main函数。

0

@nikko 是正确的。在使用 Box 类之前,您必须先声明它。可以通过以下方式之一来实现:

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

尝试这个

extern class Box;
//use box class here
//then define it later as you wish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接