我正在写一个积分计算器。我试图让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.h
和functions.cpp
个文件。当我试图将square(double aX)
定义放在IntegralCalculator
类中时,我遇到了同样的错误。同样的错误。
答案 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);
这种方式更清洁,更少混淆