代码之家  ›  专栏  ›  技术社区  ›  epochwolf

如何在C++类中创建const数组和计算const值?

  •  0
  • epochwolf  · 技术社区  · 15 年前

    我遇到了一些我不理解的编译器错误。我很确定我在这里做错了什么,但我不知道是什么。我希望所有的世界常量都被定义为属于这个类。

    我只使用类作为附加成员的结构。我不是故意遵循严格的对象或定向设计。请不要评论公共变量。

    我不太关心编译器内联的东西。我使用这个结构是因为它对我来说很容易使用。(如果有效)

    class Board{
    public:
        enum PhysicsResult{ BOUNCE, OUT_OF_BOUNDS_TOP, OUT_OF_BOUNDS_BOTTOM, CONTINUE };
        //World constants
        const static float Height = 500;
        const static float Width = 300;
        //ERROR: 'Board::Width' cannot appear in a constant-expression.
        const static float PaddleWidth = Width/15; 
        const static float BallRadius = 5;
        const static float BounceDistance = 1.5;
        //World Objects
        Ball ball;
        Paddle paddle1;
        Paddle paddle2;
        /*
         1---2
         |   |
         0---3
         */
        //ERROR: a brace-enclosed initalizer is not allowed here before '{' token
        //ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[4]'
        const static Pair corners[4] = {Pair(0, 0), Pair(0, Height), Pair(Width, Height), Pair(Width, 0)};
    
        //ERROR: a brace-enclosed initalizer is not allowed here before '{' token
        //ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[2]'
        const static Pair left_wall[2]   = {corners[0], corners[1]};
    
        //ERROR: a brace-enclosed initalizer is not allowed here before '{' token
        //ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[2]'
        const static Pair right_wall[2]  = {corners[3], corners[2]};
    
        //ERROR: a brace-enclosed initalizer is not allowed here before '{' token
        //ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[2]'
        const static Pair top_wall[2]    = {corners[1], corners[2]};
    
        //ERROR: a brace-enclosed initalizer is not allowed here before '{' token
        //ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[2]'
        const static Pair bottom_wall[2] = {corners[0], corners[3]};
    

    如果可以这样做,那么正确的语法是什么? 如果不可能,我应该使用什么替代方案?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Community omersem    7 年前

    在类的主体之外定义静态常量将使用gcc编译和执行。

    #include <iostream>
    using namespace std;
    
    struct Pair { int a; int b; Pair(int x, int y) : a(x),b(y) {}};
    struct F {
      static const float blah = 200.0;
      static const Pair corners[4];
    };
    
    // square boards are so ordinary
    const Pair F::corners[4] = { Pair(0,0), Pair(0,1), Pair(2,0), Pair(2,2) };
    
    const float F::blah ;
    
    int main(int, char **) {
      cout << F::corners[0].a << endl ;
      cout << F::blah << endl;
      return 0;
    }
    

    ebo

        2
  •  2
  •   Salman A    15 年前

    必须在构造函数初始化列表中初始化常量成员。

    class blah
    {
        public:
                blah() : _constant( 1 ) { }
    
        private:
                const int _constant;
    };
    
        3
  •  1
  •   jamuraa    15 年前

    C++对象的静态成员需要在声明之外定义。这是因为编译器不知道将成员放入哪个翻译单元(.o文件)。