未定义的引用`Init :: b'

时间:2015-03-30 14:44:32

标签: c++ netbeans linkage

我上课了

#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'

知道为什么吗?

2 个答案:

答案 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;