Мне было интересно, почему иногда мой глобальный констант, определенный в отдельном файле .h, не инициализируется должным образом, когда мне это нужно.Некоторые тесты приводят меня к ситуации, которую я не могу понять.Я не знаю, как это объяснить, поэтому вот код:
main.cpp
#include <iostream>
#include "class.h"
using namespace std;
A a;
B b;
int main(int argc, char* argv[]){
A aa;
B bb;
cout<<a.a<<" "<<aa.a<<endl;
cout<<b.b<<" "<<bb.b<<endl;
return 0;
}
class.h
#ifndef CLASS_H
#define CLASS_H
#include "const.h"
class A {
public:
A();
float a;
};
class B {
public:
B():b(CONST){}
float b;
};
#endif
class.cpp
#include "class.h"
A::A()
: a(CONST){}
const.h
#ifndef CONST_H
#define CONST_H
#include <limits>
using namespace std;
const float CONST = numeric_limits<float>::has_infinity ?
-numeric_limits<float>::infinity() :
-numeric_limits<float>::max();
#endif
После выполнения кода выше я получаю:
0 -1. # INF
-1. # INF -1. # INF
, когда на самом деле я хотел бы получить 4 раза '-1. # INF'.Почему так происходит?Если бы CONST был '1' вместо приведенной выше формулы, он работал бы отлично.
Я могу "исправить" это, сделав статический метод getConst ():
static float getConst(){
static const float CONST = numeric_limits<float>::has_infinity ?
-numeric_limits<float>::infinity() :
-numeric_limits<float>::max();
return CONST;}
, но это простоне "чувствовать" правильно.С другой стороны, мне просто нужны два из вышеперечисленных ... Но, может быть, есть какой-то другой способ?
И, самое главное, почему класс B получает "правильный" CONST, а класс A - нет?