静态初始化C++,未设置值
Static initialization C++, value not set
我正在编写一个包含几个文件的程序,让我们假设所有包含都可以。这是缩短的代码。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);
相关文章:
- 聚合初始化,将成员指针设置为同一结构成员
- 使用构造函数初始化结构还是在之后设置其值更好?
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 如何将整数重新初始化/设置为空值
- 设置 JVM 通过 JNI 初始化时创建的线程数
- 是否可以在C++中使用初始化列表设置数组的特定成员?
- 通过初始化列表设置抽象类的引用
- 2D 矢量初始化:初始化设置奇怪的长度
- 如何初始化可以设置为默认数组并将输入/输出作为数组的类函数?
- 如何在类中初始化数组并为第一个元素设置值
- 不稳定:如何设置初始化器列表和函数参数的凹痕
- 设置成员 GlobalCEFApp->OnWebKit使用函数地址初始化 C++生成器
- 设置::使用数字中的引号进行向量初始化
- Dlib:如何初始化一个忽略标志设置为1的mmodrect
- 使用父类构造函数初始化列表中的嵌套类字段中设置值
- 将预定但非初始化的向量设置为另一个别名
- 静态初始化C++,未设置值
- 当在多个声明中使用auto时,为什么需要为所有变量设置初始化器呢?
- C++:向量<通过<string>函数设置>初始化
- 在默认构造函数中显式设置初始化列表有什么优点或缺点?