C ++从main文件中的头文件调用一个函数

时间:2013-03-26 05:55:12

标签: c++ function header scope inheritance

我正在写一个积分计算器。我试图让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();
  }

正如你所看到的,还有另一个名为积分计算器的类,它实际上是对积分的计算,但是当函数定义包含在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;
 }

我知道现在我不需要<cmath>库,但是当我添加它时,我将需要更复杂的功能。

我尝试继承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类中时,我遇到了同样的错误。同样的错误。

2 个答案:

答案 0 :(得分:4)

您的问题是,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;
    }
}

你仍然像这样使用它:

IntegralCalculator Function(functions::square);

答案 1 :(得分: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);

这种方式更清洁,更少混淆