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

Как инициализровать константное поле класса в конструкторе? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
09.08.2012, 01:53     Как инициализровать константное поле класса в конструкторе? #1
Здравствуйте. Такая проблема. Класс работает с множеством картинок одинакового разрешения. Размеры картинки должны храниться в полях класса(естественно лучше константных). Такая проблема: инициализировать константы в моём случае можно только через конструктор до тела констутора; чтобы узнать размер картинки надо создавать объект любой картинки из коллекции и методами width(), height() получать необходимые данные, при этом сама картинка не является полем класса. Требуется инициализировать мои поля внутри конструтора
Как это сделать наиболее красиво и элегантно, без костылей, и чтобы класс выглядел максимально независимым модулем?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 01:53     Как инициализровать константное поле класса в конструкторе?
Посмотрите здесь:

C++ Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! C++
как в конструкторе класса передать параметром указатель на функцию? C++
Работа со строчками (как задать поле в конструкторе?) C++
C++ Только константное статическое поле НЕ МОЖЕТ быть поле членом класса !
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
09.08.2012, 02:23     Как инициализровать константное поле класса в конструкторе? #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A {
public:
  size_t width() const {
    return X;
  }
  size_t height() const {
    return Y;
  } 
private:
  static const size_t X, Y;
};
 
const size_t A::X = 100;
const size_t A::Y = 200;
 
int main () {
  A a;
  std::cout << a.width() << std::endl;
}
самый очевидный вариант

Добавлено через 37 секунд
Цитата Сообщение от Buckstabue Посмотреть сообщение
Как инициализровать константное поле класса в конструкторе?
никак - в с++ нет такого синтаксиса

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
class A {
public:
  size_t width() const {
    return X;
  }
  size_t height() const {
    return Y;
  } 
private:
  enum { X = 100, Y = 200 };
};
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
09.08.2012, 02:23     Как инициализровать константное поле класса в конструкторе? #3
Цитата Сообщение от Buckstabue Посмотреть сообщение
Размеры картинки должны храниться в полях класса(естественно лучше константных).
зачем именно константных????
а что будешь делать если придется поменять картинку?
Делаешь их приватными
и два метода SetSize GetSize
причем изменять их будет только SetSize (моешь её тоже сделать приватной и вызывать из функции загрузки картинки) и тогда никто снаружи класса не поменяет размеры
а изнутри зависит от твоей реализации
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
09.08.2012, 02:25     Как инициализровать константное поле класса в конструкторе? #4
я единственно из описания не понял - размер то известен?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
09.08.2012, 02:25     Как инициализровать константное поле класса в конструкторе? #5
тем более что константы инициализируются при компиляции(по моему)
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
09.08.2012, 02:39  [ТС]     Как инициализровать константное поле класса в конструкторе? #6
Ну класс в общем рассчитан только на строго определенный набор картинок, которые в разных системах могут быть разные, но строго определенного разрешения, и загружаются они только один раз. Ну пусть будет, как ValeryS сказал, в таком случае можно и скины делать
В идеале хотелось бы что-то вроде этого
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <imagelib>
class A
{
    A()
    {
       imagelib img("blabla.png");
       wImg = img.width();
       hImg = img.height();
 
    }
    const int wImg, hImg;
};
Добавлено через 5 минут
Придмал ещё создать вспомогательную константную струтуру, которая делает вышеназванное один раз. Только как-то некрасиво это

Добавлено через 2 минуты
А константы можно инициализировать и во время выполнения, это я точно помню. Только в классах с ними запары
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
09.08.2012, 02:42     Как инициализровать константное поле класса в конструкторе? #7
А че у тебя конструктор приватный
Цитата Сообщение от Buckstabue Посмотреть сообщение
const int wImg, hImg;
ну и ?
const убери они будут приватными и не одна собака не достучится
если хочешь чтобы все экземпляры класса работали с одним и тем же размером
сделай размер статиком

Добавлено через 2 минуты
Цитата Сообщение от Buckstabue Посмотреть сообщение
А константы можно инициализировать и во время выполнения,
в смысле?
ты можешь написать так
C++
1
2
int a=5;
const b=a;
?
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
09.08.2012, 02:49  [ТС]     Как инициализровать константное поле класса в конструкторе? #8
нет, т.к. у переменной b не объявлен тип
Цитата Сообщение от ValeryS Посмотреть сообщение
А че у тебя конструктор приватный
Так чисто для примера привел
Вот этот код работает у меня на ура
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
   int x;
   std::cin >> x;
   const int XXX = x;
   std::cout << XXX;
   return 0;
}
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
09.08.2012, 02:54     Как инициализровать константное поле класса в конструкторе? #9
а так ?
C++
1
2
int a=5;
const int b=a;
Добавлено через 2 минуты
хотя может и сработать
компилятор поймет что b пятерка и подставит значения
StasGamilton
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
09.08.2012, 02:58     Как инициализровать константное поле класса в конструкторе? #10
Наработался сегодня устал, может и не в тему попал, но как я понял вроде про это имелось в виду:
C++
1
2
3
4
5
6
class A {
public:
 A(int _a) : a(_a) {}
private:
 const int a;
};
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
09.08.2012, 03:00     Как инициализровать константное поле класса в конструкторе? #11
StasGamilton,
здесь ключевое
Цитата Сообщение от Buckstabue Посмотреть сообщение
Такая проблема: инициализировать константы в моём случае можно только через конструктор до тела констутора;
что у тебя и написано
Цитата Сообщение от StasGamilton Посмотреть сообщение
A(int _a) : a(_a) {}
StasGamilton
09.08.2012, 03:04
  #12

Не по теме:

Блин, точно наработался=(

Jupiter
09.08.2012, 09:41
  #13

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
тем более что константы инициализируются при компиляции(по моему)
ValeryS, как прикажете быть константам зависящим одна от другой? потому ответ нет!

novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 10:10     Как инициализровать константное поле класса в конструкторе? #14
Цитата Сообщение от Buckstabue Посмотреть сообщение
чтобы узнать размер картинки надо создавать объект любой картинки из коллекции и методами width(), height() получать необходимые данные, при этом сама картинка не является полем класса.
кто, предполагается, это должен делать? кто будет создавать и т.д.?
сначала нужно вопросы себе задать, зачем классу вообще эти размеры нужны? ведь он вроде с картинками работать будет, без картинки в нем вроде и смысла нет. т.е. картинка всегда под рукой со своими методами width() & height(). зачем дублировать то, что уже есть?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.08.2012, 10:30     Как инициализровать константное поле класса в конструкторе? #15
Сейчас в C++11 можно делать такое:
C++
1
2
3
4
5
6
7
class myClass
{
    int mem1 = 10;
    const int mem2 = 20;
public:
    ...
};
Но, к примеру Visual Studio 2012 RC пока еще этого не поддерживает.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
10.08.2012, 04:26  [ТС]     Как инициализровать константное поле класса в конструкторе? #16
Цитата Сообщение от novi4ok Посмотреть сообщение
картинка всегда под рукой со своими методами width() & height(). зачем дублировать то, что уже есть?
Вначале я именно так и делал, до тех пор пока не пришлось обрабатывать событие mouseMove т.е. любое перемещение мыши должно было бы либо каждый раз вызывать одни и те же функции img.width() и img.height() в то время, когда эти возвращаемые значения за время работы программы не изменяются. Мне стал этого жалко, вот и создал тему

Добавлено через 3 минуты
yuron_477, юрон, вы имеете в виду инициализвация константых полей в объявлении класса? Странно, у меня такой код ещё год назад работал на gcc не самых последних версий. И вообще такой способ инициализации есть по-моему даже в книге Дейтелов 2007 года издания
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.08.2012, 06:00     Как инициализровать константное поле класса в конструкторе? #17
Цитата Сообщение от ValeryS Посмотреть сообщение
StasGamilton,
здесь ключевое
Такая проблема: инициализировать константы в моём случае можно только через конструктор до тела констутора;
что у тебя и написано
C++
1
A(int _a) : a(_a) {}
Так инициализация в списке инициализации и происходит до тела конструктора
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.08.2012, 06:22     Как инициализровать константное поле класса в конструкторе? #18
Цитата Сообщение от Buckstabue Посмотреть сообщение
В идеале хотелось бы что-то вроде этого
Запросто:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
 
class image
{
    std::string name;
    size_t width, height;
    
public:
    image(const std::string& n)
        : name(n), width(rand() % 10 + 1), height(rand() % 10 + 1)
    {
    }
 
    size_t get_width() const
    {
        return width;
    }
 
    size_t get_height() const
    {
        return height;
    }
 
    std::string get_name() const
    {
        return name;
    }
};
 
class image_processor
{
    image img;
    const size_t img_width, img_height;
 
public:
    image_processor(const image& image)
        : img(image), img_width(img.get_width()), img_height(img.get_height())
    {
    }
 
    void run() const
    {
        std::cout << "Processing image `" << img.get_name() << "' "
                  << img_width << "x" << img_height << std::endl;
    }
};
 
int main()
{
    srand(time(NULL));
    
    image_processor(image("facepalm.jpg")).run();
}
Цитата Сообщение от Buckstabue Посмотреть сообщение
И вообще такой способ инициализации есть по-моему даже в книге Дейтелов 2007 года издания
а вот это вряд ли. Если верить этой страничке, то такое есть только в последних версиях GCC и Clang
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
10.08.2012, 06:28  [ТС]     Как инициализровать константное поле класса в конструкторе? #19
Nameless One, я же просил не только рабочий пример, но и элегантный а по мне так лучше хранить в поле класса костантную структуру типа этого
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <imagelib>
 
struct Rect
{
      int width;
      int height;
      Rect(char * str)
      {
         Image img(str);
         width = img.width();
         height = img.height();
      }
};
 
class MyClass
{
      MyClass()
         : rect("/images/01.png")
      {
         cout << rect.width << rect.height;
      }
      const Rect rect;
 
};
Но в любом случае, я решил не делать эти переменные константными, а просто внимательно слежу где что меняется, единственное что убивает, эти переменные очень часто применяются и если надо будет приступить к доработке через месяц, то и не вспомню, что её менять не следует
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2012, 06:33     Как инициализровать константное поле класса в конструкторе?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.08.2012, 06:33     Как инициализровать константное поле класса в конструкторе? #20
Цитата Сообщение от Buckstabue Посмотреть сообщение
Nameless One, я же просил не только рабочий пример, но и элегантный а по мне так лучше хранить в поле класса костантную структуру типа этого
тебе шашечки или ехать? Чтобы говорить об "элегантности", нужно сперва четко представлять, что именно и как должен делать код. Представлять общую картину, так сказать. Кроме тебя, наверное, никто в этой теме это не может сделать, т.к. автор - ты. А я всего лишь довел тобой же приведенный пример до рабочего состояния (с незначительными изменениями)
Yandex
Объявления
10.08.2012, 06:33     Как инициализровать константное поле класса в конструкторе?
Ответ Создать тему
Опции темы

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