Форум программистов, компьютерный форум CyberForum.ru

Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! - C++

Восстановить пароль Регистрация
 
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
25.08.2013, 00:04     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CCoords
{
static const float rate = 1.0f; // ОШИБКА !!!
 
      bool        IsComputed;
      float       x,y;
      POINT2D     mouse_down,mouse_pressed;
      D3DXMATRIX  world;
      D3DXVECTOR3 origin;
      D3DXVECTOR3 right,up,dir;
 
public:
                    CCoords();
      void          SetMouseDown(const POINT2D * point);
      void          SetMouse(const POINT2D *  point);
      void          SetMouseUp();
      D3DXMATRIX*   GetMatrixWorld();
private:
      void          ComputeWorldMatrix();
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2013, 00:04     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса !
Посмотрите здесь:

C++ Статическое поле
Как инициализровать константное поле класса в конструкторе? C++
C++ Статическое поле класса, имеющее тип того же класса
Изменить поле класса C++
Статическое поле,количество экземпляров класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
25.08.2013, 00:07     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #2
Цитата Сообщение от vbloodv Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CCoords
{
static const float rate = 1.0f; // ОШИБКА !!!
 
      bool        IsComputed;
      float       x,y;
      POINT2D     mouse_down,mouse_pressed;
      D3DXMATRIX  world;
      D3DXVECTOR3 origin;
      D3DXVECTOR3 right,up,dir;
 
public:
                    CCoords();
      void          SetMouseDown(const POINT2D * point);
      void          SetMouse(const POINT2D *  point);
      void          SetMouseUp();
      D3DXMATRIX*   GetMatrixWorld();
private:
      void          ComputeWorldMatrix();
};
Инициализация должна быть внекласса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CCoords
{
static const float rate; // ОШИБКА !!!
 
      bool        IsComputed;
      float       x,y;
      POINT2D     mouse_down,mouse_pressed;
      D3DXMATRIX  world;
      D3DXVECTOR3 origin;
      D3DXVECTOR3 right,up,dir;
 
public:
                    CCoords();
      void          SetMouseDown(const POINT2D * point);
      void          SetMouse(const POINT2D *  point);
      void          SetMouseUp();
      D3DXMATRIX*   GetMatrixWorld();
private:
      void          ComputeWorldMatrix();
};
static const float CCoords::rate = 1.0f;
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
25.08.2013, 00:09  [ТС]     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #3
Цитата Сообщение от Hugra Посмотреть сообщение
static const float CCoords::rate = 1.0f;
Пишет тогда "Переопределение"
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
25.08.2013, 00:10     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #4
C++
1
2
3
4
5
6
class CCoords {
    static const float rate;
public:
};
 
const float CCoords::rate = 1.f;
Модификатор static вне класса не надо указывать.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
25.08.2013, 00:11  [ТС]     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #5
Цитата Сообщение от castaway Посмотреть сообщение
const float CCoords::rate = 1.f;
Верно, в определение слово статик надо было убрать )))
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
25.08.2013, 00:12     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #6
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
2
3
4
5
6
class CCoords {
    static const float rate;
public:
};
 
const float CCoords::rate = 1.f;
Модификатор static вне класса не надо указывать.

Цитата Сообщение от vbloodv Посмотреть сообщение
Пишет тогда "Переопределение"
static забыл убрать.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 01:45     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #7
Статическое константное поле? Серьёзно?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
25.08.2013, 01:46     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #8
Цитата Сообщение от Nekto Посмотреть сообщение
Серьёзно?
Серьезно. А что?
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 02:00     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #9
Цитата Сообщение от castaway Посмотреть сообщение
Серьезно. А что?
Зачем? Я не говорю про сферического коня в вакууме, просто интересна реальная причина использования статического константного флоута в данном классе.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
25.08.2013, 02:06     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #10
Я не пойму, что именно тебе не понятно? Для тебя термины статический и константный не совместимы?
Статический член класса - это такой член, который для всех экземпляров класса один.
Константный - не изменяемый.
Что в этом такого?

Не по теме:

РМЭС читал?

gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
25.08.2013, 02:11     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #11
Цитата Сообщение от Hugra Посмотреть сообщение
Инициализация должна быть внекласса.
Можно и внутри класса.
C++
1
2
3
4
class CCoords
{
static constexpr float rate = 1.0f;
} obj;
Bash
1
-std=c++11
Добавлено через 4 минуты
Можно и так:

C++
1
2
3
4
class CCoords
{
static const float rate = 1.0f;
} obj;
Bash
1
-std=c++98
TC, не понимаю, что у вас за ошибки-то?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 02:49     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #12
Цитата Сообщение от gromo Посмотреть сообщение
TC, не понимаю, что у вас за ошибки-то?
Студия такое не компилирует.
http://stackoverflow.com/questions/2...e-static-const
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 02:53     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #13
Цитата Сообщение от gromo Посмотреть сообщение
Можно и внутри класса.
От компилятора зависит.

Добавлено через 2 минуты
Цитата Сообщение от castaway Посмотреть сообщение
Я не пойму, что именно тебе не понятно? Для тебя термины статический и константный не совместимы?
Статический член класса - это такой член, который для всех экземпляров класса один.
Константный - не изменяемый.
Что в этом такого?
Т.е. изменений в процессе работы не предвидится. Почему не просто константный, а значение в конструкторе задавать.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
28.08.2013, 15:29  [ТС]     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #14
Цитата Сообщение от Nekto Посмотреть сообщение
Зачем? Я не говорю про сферического коня в вакууме, просто интересна реальная причина использования статического константного флоута в данном классе.
Константные переменные которые не стоит размещать в глобальном пространстве имен, а запихнуть в класс и сделать статическими, чтобы не увеличивать объем класса...

Добавлено через 2 минуты
Цитата Сообщение от Nekto Посмотреть сообщение
От компилятора зависит.
Студия это само по себе UB

Добавлено через 4 минуты
Цитата Сообщение от Nekto Посмотреть сообщение
Т.е. изменений в процессе работы не предвидится. Почему не просто константный, а значение в конструкторе задавать.
Потому что тогда при создании каждого нового объекта при const int ss = 88; объем используемого места будет увеличиваться на 4 (sizeof(ss)), а если переменная статическая, то только один раз
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 15:39     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Студия такое не компилирует.
Щито?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
class MyClass
{
public:
    static const int x = 5;
};
 
int main()
{
    MyClass x;
    return 0;
}
Студия 2012 - все компилится и работает.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 15:43     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #16
Цитата Сообщение от vbloodv Посмотреть сообщение
Студия это само по себе UB
А стандарт?
§9.4.2/4
If a static data member is of const integral or const enumeration type, its declaration in the class
definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that
case, the member can appear in integral constant expressions. The member shall still be defined in a namespace
scope if it is used in the program and the namespace scope definition shall not contain an initializer.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 15:45     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #17
Dani, с int'ом ясное дело скомпилит float поставьте
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 15:46     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #18
Цитата Сообщение от Dani Посмотреть сообщение
Щито?
Где, в обсуждаемом примере, переменная типа int? int можно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 17:18     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса !
Еще ссылки по теме:

Друзья, подскажите, как в классе создать константное поле, ссылочное поле и объектное поле? C++
Создать класс. Символьное поле должно быть задано как объект класса string C++
C++ Когда оператор должен быть обязательно членом класса, и когда он обязательно не принадлежит классу?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
28.08.2013, 17:18  [ТС]     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! #19
Цитата Сообщение от Croessmah Посмотреть сообщение
Dani, с int'ом ясное дело скомпилит float поставьте
C++
1
const float CCoords::RATE = 2.5f; // Да, верно оно у меня изначально с float'ом было !
Yandex
Объявления
28.08.2013, 17:18     Только константное статическое поле НЕ МОЖЕТ быть поле членом класса !
Ответ Создать тему
Опции темы

Текущее время: 00:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru