gpt4 book ai didi

C++ 从头文件中调用函数

转载 作者:太空狗 更新时间:2023-10-29 21:02:21 26 4
gpt4 key购买 nike

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

我知道现在我不需要 <cmath>库,尽管我在添加它们时需要它来实现更复杂的功能。

我试过在 main 中继承函数类,我也试过为函数类创建一个命名空间并定义函数,但是这些都没有用。当我去编译时,出现以下错误:

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

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

如果有人可以帮我解决这个问题。我尝试编写的这段代码比我的类(class)更高级,所以我不确定如何修复它,尽管我想以这种方式编写程序。

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

最佳答案

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

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


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

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

double square(double aX);

在函数.cpp中

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

main.cpp 中的用法:

IntegralCalculator Function(square);

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

在函数.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);

关于C++ 从头文件中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15630293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com