2011-10-17 2 views
2

Это не работает. Это дает ошибку относительно ISO C++, запрещающего инициализацию.Правильный способ добавления константы в класс

class hash_map 
{ 
private: 
    hash_entry **table; 
    const int TABLE_SIZE = 128; 
public: 
    hash_map() 
    { 
     table = new hash_entry*[TABLE_SIZE]; 
     for (int i = 0; i < TABLE_SIZE; i++) 
      table[i] = NULL; 
    } 
    int get(int key) 
    { 
     int hash = (key % TABLE_SIZE); 
     while (table[hash] != NULL && table[hash]->getKey() != key) 
      hash = (hash + 1) % TABLE_SIZE; 
     if (table[hash] == NULL) 
      return -1; 
     else 
      return table[hash]->getValue(); 
    } 
    void put(int key, int value) 
    { 
     int hash = (key % TABLE_SIZE); 
     while (table[hash] != NULL && table[hash]->getKey() != key) 
      hash = (hash + 1) % TABLE_SIZE; 
     if (table[hash] != NULL) 
      delete table[hash]; 
     table[hash] = new hash_entry(key, value); 
    } 
    ~hash_map() 
    { 
     for (int i = 0; i < TABLE_SIZE; i++) 
      if (table[i] != NULL) delete table[i]; 
     delete[] table; 
    } 
}; 
+1

вы можете предоставить реальное сообщение об ошибке? – StevieG

+1

Вам не нужно проверять значение NULL перед 'delete'ing. 'delete NULL;' отлично действует. – Praetorian

+2

Не забудьте либо реализовать конструктор копирования и оператор присваивания, либо объявить их закрытыми. –

ответ

8
const int TABLE_SIZE = 128; 

Это является причиной ошибки компиляции. Допускается только в C++ 11 , а не в C++ 03 и C++ 98.

Либо сделайте его членом класса static, либо инициализируйте его в конструкторе. Используйте для него список инициализации-члена.

Помимо этого не забудьте осуществить копирование семантики следующих Rule of Three ИЛИ отключить его совсем по объявляющего их (не определитьthem) в разделе private. Я думаю, что отключение в этом случае имеет смысл.

+0

works ... thanks ... можно было бы подумать, что const подразумевает static для компилятора –

+1

@ChrisAaker: Нет, каждый экземпляр класса может иметь другую 'const int TABLE_SIZE', если он инициализируется в конструкторе.(Хотя я согласен, если он инициализирован на месте, как и вы) –

+1

@Chris: для глобальных переменных это делает (хотя 'static' имеет совсем другое значение там). Членские переменные являются только статическими, если вы их объявляете так: иногда вам нужны нестатические константные члены. –

4

Вы должны инициализировать его в конструкторе, изменить

const int TABLE_SIZE = 128; 

в

const int TABLE_SIZE; 

и конструктор из

hash_map() 
    { 
    table = new hash_entry*[TABLE_SIZE]; 
    for (int i = 0; i < TABLE_SIZE; i++) table[i] = NULL; 
    } 

к

hash_map() : TABLE_SIZE(128) 
    { 
    table = new hash_entry*[TABLE_SIZE]; 
    for (int i = 0; i < TABLE_SIZE; i++) table[i] = NULL; 
    } 
+3

Было бы лучше сделать это 'static', уменьшить размер объекта и позволить некоторые значительные оптимизации. –

0

Вы должны поместить инициализацию в конструкторе следующим образом:

class hash_map 
    { 
    private: 
    hash_entry **table; 
    const int TABLE_SIZE; 
    public: 
    hash_map(): TABLE_SIZE(128) 
     { 
     table = new hash_entry*[TABLE_SIZE]; 
     for (int i = 0; i < TABLE_SIZE; i++) table[i] = NULL; 
     } 
    ... 
0

Вы могли бы быть более конкретными и обеспечить минимальный пример, который воспроизводит эту проблему и точную ошибку, компилятор выдаст вам. Но в любом случае, даже без психическая режим включен, то очевидно, что ошибка в этой строке:

const int TABLE_SIZE = 128; 

Вы не можете инициализировать член класса, как это, он имеет не должно быть сделано в списке инициализации конструктора, если этого пользователя является статическим константным временем компиляции-времени (constexpr в C++ 11).

Так удалить = 128 из этой строки и изменить конструктор, чтобы сделать это:

hash_map() : TABLE_SIZE (128) 
     { 
.... 
0

Используйте перечисленный тип:

class hash_map 
{ 
    private: 
    enum 
    { 
     TABLE_SIZE = 128; 
    }; 
    hash_entry * table[TABLE_SIZE]; 
//... 
}; 
Смежные вопросы