问题描述
我只是在学习 C++(自从我多年前参加了 1 周的夏令营以来的第一天)
I'm just learning c++ (first day looking at it since I took a 1 week summer camp years ago)
我正在将我正在用 Java 编写的程序转换为 C++:
I was converting a program I'm working on in Java to C++:
#ifndef ADD_H
#define ADD_H
#define _USE_MATH_DEFINES
#include <iostream>
#include <math.h>
using namespace std;
class Evaluatable {
public:
virtual double evaluate(double x);
};
class SkewNormalEvalutatable : Evaluatable{
public:
SkewNormalEvalutatable();
double evaluate(double x){
return 1 / sqrt(2 * M_PI) * pow(2.71828182845904523536, -x * x / 2);
}
};
SkewNormalEvalutatable::SkewNormalEvalutatable()
{
}
double getSkewNormal(double skewValue, double x)
{
SkewNormalEvalutatable e ();
return 2 / sqrt(2 * M_PI) * pow(2.71828182845904523536, -x * x / 2) * integrate(-1000, skewValue * x, 10000, e);
}
// double normalDist(double x){
// return 1 / Math.sqrt(2 * Math.PI) * Math.pow(Math.E, -x * x / 2);
// }
double integrate (double start, double stop,
int numSteps,
Evaluatable evalObj)
{
double stepSize = (stop - start) / (double)numSteps;
start = start + stepSize / 2.0;
return (stepSize * sum(start, stop, stepSize, evalObj));
}
double sum (double start, double stop,
double stepSize,
Evaluatable evalObj)
{
double sum = 0.0, current = start;
while (current <= stop) {
sum += evalObj.evaluate(current);
current += stepSize;
}
return(sum);
}
// int main()
// {
// cout << getSkewNormal(10.0, 0) << endl;
// return 0;
// }
#endif
错误是:
SkewNormal.h: In function 'double getSkewNormal(double, double)' :
SkewNormal.h: 29: error: 'integrate' was not declared in this scope
SkewNormal.h: In function 'double integrate(double, double, int, Evaluatable)':
SkewNormal.h:41: error: 'sum' was not declared in this scope
Integrate 和 sum 都应该是函数
Integrate and sum are both supposed to be functions
这是Java代码,大致相同:
Here is the Java code, more or less the same:
public static double negativelySkewed(double skew, int min, int max){
return randomSkew(skew) * (max - min) + min;
}
public static double randomSkew(final double skew){
final double xVal = Math.random();
return 2 * normalDist(xVal) * Integral.integrate(-500, skew * xVal, 100000, new Evaluatable() {
@Override
public double evaluate(double value) {
return normalDist(value);
}
});
}
public static double normalDist(double x){
return 1 / Math.sqrt(2 * Math.PI) * Math.pow(Math.E, -x * x / 2);
}
/** A class to calculate summations and numeric integrals. The
* integral is calculated according to the midpoint rule.
*
* Taken from Core Web Programming from
* Prentice Hall and Sun Microsystems Press,
* http://www.corewebprogramming.com/.
* © 2001 Marty Hall and Larry Brown;
* may be freely used or adapted.
*/
public static class Integral {
/** Returns the sum of f(x) from x=start to x=stop, where the
* function f is defined by the evaluate method of the
* Evaluatable object.
*/
public static double sum(double start, double stop,
double stepSize,
Evaluatable evalObj) {
double sum = 0.0, current = start;
while (current <= stop) {
sum += evalObj.evaluate(current);
current += stepSize;
}
return(sum);
}
/** Returns an approximation of the integral of f(x) from
* start to stop, using the midpoint rule. The function f is
* defined by the evaluate method of the Evaluatable object.
*/
public static double integrate(double start, double stop,
int numSteps,
Evaluatable evalObj) {
double stepSize = (stop - start) / (double)numSteps;
start = start + stepSize / 2.0;
return(stepSize * sum(start, stop, stepSize, evalObj));
}
}
/** An interface for evaluating functions y = f(x) at a specific
* value. Both x and y are double-precision floating-point
* numbers.
*
* Taken from Core Web Programming from
* Prentice Hall and Sun Microsystems Press,
* http://www.corewebprogramming.com/.
* © 2001 Marty Hall and Larry Brown;
* may be freely used or adapted.
*/
public static interface Evaluatable {
public double evaluate(double value);
}
我确定这是非常简单的事情
I'm certain it's something very simple
还有,我怎么打电话
getSkewNormal(double skewValue, double x)
来自 SkewNormal.h 之外的文件?
From a file outside SkewNormal.h?
推荐答案
在 C++ 中,您应该先声明函数,然后才能使用它们.在您的代码中,integrate
在第一次调用 integrate
之前没有声明.这同样适用于 sum
.因此错误.要么重新排序您的定义,使函数定义先于对该函数的第一次调用,要么为每个函数引入一个 [forward] 非定义声明.
In C++ you are supposed to declare functions before you can use them. In your code integrate
is not declared before the point of the first call to integrate
. The same applies to sum
. Hence the error. Either reorder your definitions so that function definition precedes the first call to that function, or introduce a [forward] non-defining declaration for each function.
此外,在 C++ 中,在头文件中定义外部非内联函数.您对 SkewNormalEvalutatable::SkewNormalEvalutatable
、getSkewNormal
、integrate
等的定义在头文件中没有作用.
Additionally, defining external non-inline functions in header files in a no-no in C++. Your definitions of SkewNormalEvalutatable::SkewNormalEvalutatable
, getSkewNormal
, integrate
etc. have no business being in header file.
Also SkewNormalEvalutatable e();
C++ 中的声明声明了一个函数 e
,而不是您似乎假设的对象 e
.简单的 SkewNormalEvalutatable e;
将声明一个由默认构造函数初始化的对象.
Also SkewNormalEvalutatable e();
declaration in C++ declares a function e
, not an object e
as you seem to assume. The simple SkewNormalEvalutatable e;
will declare an object initialized by default constructor.
此外,您将integrate
(和sum
)的最后一个参数按值作为Evaluatable的对象接收代码>类型.这意味着尝试将
SkewNormalEvalutatable
作为 integrate
的最后一个参数传递将导致 SkewNormalEvalutatable
被分割为 Evaluatable
.因此,多态性将不起作用.如果你想要多态行为,你必须通过引用或指针接收这个参数,而不是通过值.
Also, you receive the last parameter of integrate
(and of sum
) by value as an object of Evaluatable
type. That means that attempting to pass SkewNormalEvalutatable
as last argument of integrate
will result in SkewNormalEvalutatable
getting sliced to Evaluatable
. Polymorphism won't work because of that. If you want polymorphic behavior, you have to receive this parameter by reference or by pointer, but not by value.
这篇关于'foo' 未在此范围内声明 c++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!