需要初始化const大数组

时间:2014-01-21 02:48:20

标签: c++ arrays static initialization

我的班级里面有一个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做到。

3 个答案:

答案 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指针并将其指向您的数据。做铸造,添加详细的评论和解释为什么你这样做,你会没事的。优点:

  1. 代码绝对清晰;
  2. 它可以在任何平台/编译器上运行;
  3. 投射将在一个不太可能改变的地方。
  4. 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);
};