Как создать массивы const и вычисленные значения const в классе C ++? - PullRequest
0 голосов
/ 14 мая 2009

Я сталкиваюсь с некоторыми ошибками компилятора, которые не понимаю. Я почти уверен, что делаю что-то очень неправильное, но я не знаю что. Я хотел бы, чтобы все мировые константы были определены как принадлежащие классу.

Примечания:

Я использую классы только как структуры с прикрепленными членами. Я не следую строгому объектно-ориентированному дизайну специально. Пожалуйста, не комментируйте публичные переменные.

Меня не очень беспокоит вопрос о компиляции компилятора. Я использую эту структуру, потому что мне легко пользоваться. (Если это сработало)

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 ]

5 голосов
/ 14 мая 2009

Определение статических констант вне тела класса компилируется и выполняется с помощью 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 голосов
/ 14 мая 2009

Вы должны инициализировать константные члены в списке инициализации конструктора.

class blah
{
    public:
            blah() : _constant( 1 ) { }

    private:
            const int _constant;
};
1 голос
/ 14 мая 2009

Статические члены объектов C ++ должны быть определены вне объявления. Это потому, что компилятор не знает, в какую единицу перевода (файл .o) помещать элементы.

Обычно я определяю их в файле .cpp реализации. Как правило, вы не хотите помещать их в заголовочный файл, потому что они окажутся в нескольких .o файлах, и это вызовет ошибки компилятора, потому что одна и та же вещь определяется несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...