我上课了
#include<cstdlib>
#include<time.h>
struct between{
double min;
double max;
};
class Init{
public:
static const int args=2;
static between* b;
static double function(double i[]){
return abs(i[0]*i[1]);
return (25*i[0]*i[0]-5*i[0]+3);
}
static double abs(double d){
return (d>0?d:-d);
}
};
和课程包括:
#include "Init.cpp"
#include<iostream>
using namespace std;
class Chunk{
public:
double values[Init::args];
double res;
static Chunk* sex(Chunk* c1,Chunk* c2){
Chunk* c=new Chunk();
for(int a=0;a<Init::args;a++){
double t=getRand();
c->values[a]=c1->values[a]*t+c2->values[a]*(1.0-t);
}
return c;
}
static double getRand(){
double d=rand()/(double)RAND_MAX;
return d;
}
double getResult(){
res=Init::function(values);
}
static Chunk* generateChunk(){
Chunk* c=new Chunk();
for(int a=0;a<Init::args;a++){
double t=getRand();
c->values[a]=Init::b[a].min*t+Init::b[a].max*(1.0-t);//ERROR HERE!
}
return c;
}
};
我得到错误:
/home/oneat/NetBeansProjects/wearethechampions/Chunk.cpp:33:未定义的引用`Init :: b'
知道为什么吗?
答案 0 :(得分:2)
错误是由类Init
中未定义的静态变量引起的。
您声明了两个这样的变量:
static const int args = 2;
这是声明和类内初始化 - 允许在类体内初始化常量整数。这些成员不需要额外的定义,除非您想将它们用作lvalue。
static between* b;
这只是声明,b
无法在任何地方定义。在源文件(.cpp
)中,包含属于Init
类的方法的定义,添加以下行(通常要对所有指针进行零初始化):
between* Init::b = NULL; //In pre-C++11 code
或
between* Init::b = nullptr; //In C++11-compliant code
答案 1 :(得分:1)
您需要添加CPP文件:
between* Init::b = NULL ;
您在标题中定义了b,但没有在任何对象中定义静态对象的主体。
编辑(因为你只有.cpp文件)
在课堂外定义b值。
意思是,在Init类声明之后,添加以下行:
between* Init::b=NULL;