静态初始化C++,未设置值

Static initialization C++, value not set

本文关键字:设置 初始化 C++ 静态      更新时间:2023-10-16

我正在编写一个包含几个文件的程序,让我们假设所有包含都可以。这是缩短的代码。ZZ.hpp:

class ZZ
{
    public:
        ZZ(ZZ const & a) { mpz_init_set(data, a.data); }
        ZZ(int a = 0) { mpz_init_set_si(data, a); }
.
.
.

ZZmodN.hpp:

template <unsigned ID>
class ZZmodN
{
    public:
    ZZmodN() = default;
    ZZmodN(ZZmodN const &) = default;
    template <typename T>
    ZZmodN(T const & a) : value(a) { value %= modulus; }
.
.
.    
    private:
    ZZ value;
    static ZZ modulus;
};
template <unsigned ID>
ZZ ZZmodN<ID>::modulus(19);
.
.
.

多项式:

class Polynomial{
    public:
    std::vector<ZZmodN<0> > co;
    Polynomial(){};
    Polynomial(ZZmodN<0> a){
        co.push_back(a);
    }
.
.

最后是字段.h:

#include "Polynomial.h"
class Field{
    public:
    static Polynomial f;
    Polynomial poly;
    Field(){}
.
.
};
Polynomial Field::f = Polynomial(1);  

问题是:当我调用最后一行 (*) 时,我收到浮点异常,因为当值 %= 模数时,"模数"= 0; 被调用。为什么是 0 而不是 19?我检查了一下,调用了 19 的 ZZ 构造函数。请帮忙。

您遇到的问题是静态初始化顺序惨败。 在您的情况下,链接器决定在初始化ZZmodN<0>::modulus之前初始化Field::f

如果你把modulus做成一个函数,就像下面的代码一样,你的问题应该会消失。 必须先初始化_m,然后才能返回modulus()

template <unsigned ID>
class ZZmodN
{
public:
    ZZmodN() = default;
    ZZmodN(ZZmodN const &) = default;
    template <typename T>
    ZZmodN(T const & a) : value(a) { value %= modulus(); } // changed
// ...
private:
    ZZ value;
    // static ZZ modulus;
    static ZZ modulus()
    {
        static ZZ _m(19);
        return _m;
    }
};
//template <unsigned ID>
//ZZ ZZmodN<ID>::modulus(19);