4

我正在写一个积分计算器。我试图让 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实际上进行了积分的计算,尽管当函数定义包含在主函数中并且函数作为参数传递时,它应该没有问题。该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;
 }

我知道到目前为止我不需要该<cmath>库,尽管当我添加它们时我将需要它来实现更复杂的功能。

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

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

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

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

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

4

2 回答 2

6

您的问题是,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 中的函数构造函数:

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);
于 2013-03-26T06:12:22.313 回答
0

你有:

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);

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

于 2013-03-26T06:19:06.103 回答