我的班级里面有一个double
的静态数组,我希望它是const
,但我需要以某种方式初始化它。在构造函数返回后确保它为“const
”的最佳方法是什么?
class DFTDriver {
public:
static const size_t tblsize = 16384;
DFTDriver() {
for (unsigned i = 0; i != tblsize; ++i) {
sintbl[i] = std::sin(i * TAU / tblsize);
costbl[i] = std::cos(i * TAU / tblsize);
}
}
private:
static double sintbl[tblsize];
static double costbl[tblsize];
};
我知道我需要一个计算来初始化它们,所以要求它们为const
是不合理的。但是,数组显然是“语义const
”。
如果我初始化向量而不是数组,我看到here有答案。是否可以使用类似的方法?
我希望能够在不吸引新的C ++ 11构造的情况下做到这一点,但如果不可能,那么让C ++ 11做到。
答案 0 :(得分:4)
制作程序以生成表格
FILE * file = fopen( "sintbl.cpp", "w" );
fprintf( file, "const double DFTDriver::sintbl[] = {\n" );
for (unsigned i = 0; i != tblsize; ++i) {
fprint( file, " %f , \n", std::sin(i * TAU / tblsize) );
}
fprintf( file, "};\n" );
fclose( file );
然后编译生成的文件并将其链接到您的程序中。
答案 1 :(得分:1)
我知道很多人都愿意拒绝我的回答,但我希望他们在这样做之前会考虑一下。
当使用简单的转换时,可能就是这个问题。数据字段应声明为const。这将保证它不会在某处意外更改。您应该在初始化函数中分配非const指针并将其指向您的数据。做铸造,添加详细的评论和解释为什么你这样做,你会没事的。优点:
P.S。我建议您添加类的静态实例并将您的ctor设为私有。这将保证在开始时调用ctor:
class DFTDriver
{
private:
DFTDriver() { .... }
static DTFDriver inst;
static double sintbl[tblsize];
static double costbl[tblsize];
};
生成源的另一个答案也很有意义,尽管代码将更难维护。
答案 2 :(得分:0)
这应该有效
class DFTDriver {
template<class ElementType, size_t size>
struct Buffer
{
Buffer(ElementType(*initializer)(size_t i)) {
for(size_t i = 0; i < size; ++i) {
data[i] = initializer(i);
}
}
const ElementType operator[](size_t i) const {return data[i];}
ElementType& operator[](size_t i) {return data[i];}
ElementType data[size];
};
double initSinbl(size_t i) {
return std::sin(i * TAU / tblsize);
}
double initCosbl(size_t i) {
return std::cos(i * TAU / tblsize);
}
public:
static const size_t tblsize = 16384;
private:
//initSinbl and initCosbl can be replaced with lambdas in c++11
static const Buffer<double, tblsize> sintbl(&initSinbl);
static const Buffer<double, tblsize> costbl(&initCosbl);
};