【问题标题】:C++ Calling a function from the header file in the mainC++ 从 main 中的头文件调用函数
【发布时间】:2013-03-15 20:21:42
【问题描述】:

我正在编写一个积分计算器。我试图让 main.cpp 文件从 functions.h.cpp 文件中的函数类中读取函数。对于简单的情况,我有一个定义如下的函数:

double square(double aX)
 {
   return aX*aX;
 }

当我将它包含在主文件中时,此函数有效,但当我尝试在函数文件中时从主文件中调用它时,它不想工作。这是我的代码:

Main.cpp文件:

#include <iostream>
#include "IntegralCalculator.h"
#include "functions.h"

using namespace std;

int main()
  {
    IntegralCalculator Function(square);
    Function.print();
  }

如您所见,还有另一个名为 IntegralCalculator 的类实际上进行了积分的计算,尽管它应该没有错,因为它在函数定义包含在 main 中并且函数被传递时工作作为参数。 functions.h 文件定义如下:

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include <iostream>
#include <cmath>
#include "IntegralCalculator.h"


class functions : public IntegralCalculator
 {
  public:
   functions();
   double square(double aX);

 };

#endif

functions.cpp 文件是这样定义的:

#include <iostream>
#include <cmath>
#include "functions.h"


double functions::square(double aX)
 {
   return aX*aX;
 }

我知道目前我不需要 &lt;cmath&gt; 库,但当我添加它们时,我将需要它来处理更复杂的功能。

我尝试在 main 中继承函数类,并尝试为函数类创建命名空间并定义函数,但是这些都不起作用。当我去编译时,我得到以下错误:

Main.cpp: In function ‘int main()’:

Main.cpp:9: error: ‘square’ was not declared in this scope

如果有人可以帮我解决这个问题。我正在尝试编写的这段代码比我的课程更先进,所以我不确定如何修复它,尽管我想以这种方式编写程序。

编辑:如果您好奇,我在 Makefile 中包含了 functions.hfunctions.cpp 文件。当我尝试将 square(double aX) 定义也放入 IntegralCalculator 类时,我遇到了同样的错误。

【问题讨论】:

  • 您是否在functions.h 中声明了double square(double aX)
  • 如果你查看我有functions.h 文件的部分,你会发现我有。
  • 您的问题似乎是您在functions类中声明了square函数,因此使其成为成员函数,您必须将其声明为double functions::square(double ax){... }
  • @RaduCivu 忘了把那部分放在帖子里。我确实有它,但我得到了同样的错误。
  • IntegralCalculator::IntegralCalculator(????)(构造函数)的定义是什么?

标签: c++ function header scope inheritance


【解决方案1】:

您的问题是,square 是成员函数 AKA 方法。换句话说,任何地方都没有简单的符号square,它是functions::square。并且因为它不是静态方法,单独使用没有意义,它总是需要一个对应的对象实例,而你没有,IntegralCalculator 即使你有也无法使用。

3 个解决方案,按最简单、最接近您的问题、最好的顺序排列:


从构造函数声明中,将square移出类,使其成为全局函数:

在任何类之外的functions.h中:

double square(double aX);

在functions.cpp中

double square(double aX) {
    return aX*aX;
}

main.cpp 中的用法:

IntegralCalculator Function(square);

或者让它成为静态方法(如果你使用像 Java 这样的语言,你必须这样做,它不允许“裸”函数,但不是真正的 C++ 方式):

在functions.h中:

class functions // inheriting IntegralCalculator removed as not needed
{
    public:
    static double square(double aX);
};

在functions.cpp中:

//static
double functions::square(double aX) {
    return aX*aX;
}

然后你可以像这样将它传递给main.cpp中的`Function constructor:

IntegralCalculator Function(functions::square);

最后,也许是最好的解决方案,将上述两者中最好的一种结合起来:将square 放在命名空间中。所以functions.h变成了

namespace functions {
    double square(double aX)
}

functions.cpp 变成

namespace functions {
    double square(double aX) {
        return aX*aX;
    }
}

你仍然像这样在 main 中使用它:

IntegralCalculator Function(functions::square);

【讨论】:

    【解决方案2】:

    你有:

    class functions : public IntegralCalculator
     {
      public:
       functions();
       double square(double aX);
    
     };
    

    这没问题,但不会告诉其他 cpp 文件在您的 functions.cpp 文件的某处有一个名为 square 的全局函数。 您需要做的是包含该函数的标头,以便编译器知道它存在:

    double square(double ax);
    class functions : public IntegralCalculator
     {
      public:
       functions();
       double square(double aX);
    
     };
    

    也与您的问题完全无关,但在看到您的构造函数代码后值得一提,您可能希望使用 typedef 来声明函数指针,如下所示:

    typedef double (IntegralFunctor*)(double);
    

    这样你的构造函数现在就可以了

    IntegralCalculator::IntegralCalculator(IntegralFunctor func);
    

    这样更干净,更不容易混淆

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多