如何在 c++ 的主类中创建模块

How to create a module in the main class in c++?

本文关键字:创建 模块 c++      更新时间:2023-10-16

我有一个很大的问题,这可能是新手的问题。我的问题是我收到一个错误,指出该方法不是在此范围内创建的,但确实如此。

int main() { //beggining main
  int n;
  int m;
  int result =0;
  cout << "Dime m en (m sobre n)" << endl;
  cin >> m;
  cout << "Dime n:" << endl;
  cin >> n; 
  result = calculate(m,n);
  cout << result << endl;
  return 0;
} //finish main
int calculate(int m, int n){ //begin calculate
  return m+n;
} //finish calculate

当我构建项目时,我得到 "计算" 没有在这个范围内声明 结果 = 计算(m,n); 行 ;

这可能是一件愚蠢的事情,但为什么我会收到此错误?多谢

为什么会出现此错误?

编译器只知道已声明的内容。在它遇到语句的那一点

result = calculate(m,n);

在您的int main()函数中,它没有遇到符合用法(或在这种情况下的任何用法)的calculate声明,因此您的程序有问题。

因此,在使用函数之前,您必须告诉编译器您的函数calculate()。这可以通过将calculate()的定义移到main()的定义前面,或者仅仅添加一个声明,告诉编译器这样的函数存在,并在以后提供其主体,如

int calculate(int, int);      // make this function known to the compiler
int main() {
    /* ... */
    result = calculate(m,n);  // okay: function is known
    /* ... */
}
int calculate(int n, int m)   // provide full function definition
{
    /* ... */
    return result;
}

在这里,calculate()的声明可能在另一个文件(一个头文件,比如calculate.h),而calculate()的完整定义在另一个文件(一个源文件,比如calculate.cc)。在后一种情况下,您必须确保加载器找到从 main() 调用的正确函数,即您必须将目标文件链接在一起。

向前声明你的calculate函数,如下所示:

int calculate(int m, int n);
int main() { //beginning main
    int n;
    int m;
    int result =0;
    cout << "Dime m en (m sobre n)" << endl;
    cin >> m;
    cout << "Dime n:" << endl;
    cin >> n;
    result = calculate(m,n);
    cout << result << endl;
    return 0;
} //finish main
int calculate(int m, int n){ //begin calculate
    return m+n;
}

你必须这样做的原因是因为在 C 和 C++ 中,编译器在遇到对 calculate() 的调用时还不知道你的函数存在。有两种方法可以避免由此行为引起的错误:要么在main之前定义整个函数及其主体,然后编译器在看到calculate()调用时将知道所有内容,或者您只需使用所谓的原型声明函数,该原型声明名称, 参数类型,并返回函数的类型,然后稍后定义函数体。此处的代码采用后一种方法。

编译器只能在给定点解析它熟悉的名称。它需要解决对calculate()调用的点是在代码中提及它之前,因此编译器此时不熟悉它。

要解决此问题,您需要在调用它的函数(即main()函数)之前(在上面的代码中)声明calculate()

通过以下任一方式实现此目的:

  1. 移动calculate()的整个定义,使其位于main()上方 - 可以位于同一.cpp文件中,也可以位于包含的头文件中。

  2. 或者,只需在main()上方的某个位置声明calculate() - 可以在同一个.cpp文件中或在包含的头文件中 - 并将定义保留在现在的位置。