2014-01-10 143 views
0

我正在用一些文件编写一个程序,我们假设所有包含都没问题。这里是缩短的代码。 ZZ.hpp:静态初始化C++,未设置值

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); 
. 
. 
. 

Polynomial.h:

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

终于Field.h:

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

问题:我在收到浮点异常时我呼叫最后一个(*)行,因为'%'=模数时'模数'= 0;叫做。为什么是0而不是19?我查了一下,并且调用了19的ZZ构造函数。 请帮忙。

+0

我想你可能会看到[静态初始化顺序失败](http://www.parashift.com/c++-faq/static-init-order.html)。 –

回答

6

您遇到的问题是static initialization order fiasco。在你的情况下,链接器在初始化ZZmodN<0>::modulus之前决定初始化Field::f

+1

+1伟大的思想...... 8v) –

+0

同步对象更有趣(特别是如果它们是某些更高级别对象初始化的一部分):D – Paranaix

1

如果您使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);