Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
#1

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

09.08.2012, 01:53. Просмотров 1520. Ответов 22
Метки нет (Все метки)

Здравствуйте. Такая проблема. Класс работает с множеством картинок одинакового разрешения. Размеры картинки должны храниться в полях класса(естественно лучше константных). Такая проблема: инициализировать константы в моём случае можно только через конструктор до тела констутора; чтобы узнать размер картинки надо создавать объект любой картинки из коллекции и методами width(), height() получать необходимые данные, при этом сама картинка не является полем класса. Требуется инициализировать мои поля внутри конструтора
Как это сделать наиболее красиво и элегантно, без костылей, и чтобы класс выглядел максимально независимым модулем?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 01:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как инициализровать константное поле класса в конструкторе? (C++):

Константное поле класса как размер массива - C++
class Array { private: const int size; int array; public: Array(): size(10) { }

Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! - C++
class CCoords { static const float rate = 1.0f; // ОШИБКА !!! bool IsComputed; float x,y; POINT2D ...

Друзья, подскажите, как в классе создать константное поле, ссылочное поле и объектное поле? - C++
Препод на защите лабораторной по классам дал задание большое. В общем-то все пункты я знаю как делать, кроме этого. Вот что такое...

В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! - C++
Друзья! Почему так? #include <windows.h> #include <iostream> using namespace std; //Вот главный класс class A{ ...

Мое константное статическое поле только что было использовано до того как оно создалось? - C++
В названии темы уже понятно, думаю, что у меня за проблема. Я экспериментировал со статическими полями классов (в частности с...

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса? - C++
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и вызывается в его конструкторе (камень...

22
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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 };
};
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
09.08.2012, 02:23 #3
Цитата Сообщение от Buckstabue Посмотреть сообщение
Размеры картинки должны храниться в полях класса(естественно лучше константных).
зачем именно константных????
а что будешь делать если придется поменять картинку?
Делаешь их приватными
и два метода SetSize GetSize
причем изменять их будет только SetSize (моешь её тоже сделать приватной и вызывать из функции загрузки картинки) и тогда никто снаружи класса не поменяет размеры
а изнутри зависит от твоей реализации
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.08.2012, 02:25 #4
я единственно из описания не понял - размер то известен?
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
09.08.2012, 02:25 #5
тем более что константы инициализируются при компиляции(по моему)
0
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 минуты
А константы можно инициализировать и во время выполнения, это я точно помню. Только в классах с ними запары
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
09.08.2012, 02:42 #7
А че у тебя конструктор приватный
Цитата Сообщение от Buckstabue Посмотреть сообщение
const int wImg, hImg;
ну и ?
const убери они будут приватными и не одна собака не достучится
если хочешь чтобы все экземпляры класса работали с одним и тем же размером
сделай размер статиком

Добавлено через 2 минуты
Цитата Сообщение от Buckstabue Посмотреть сообщение
А константы можно инициализировать и во время выполнения,
в смысле?
ты можешь написать так
C++
1
2
int a=5;
const b=a;
?
0
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;
}
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
09.08.2012, 02:54 #9
а так ?
C++
1
2
int a=5;
const int b=a;
Добавлено через 2 минуты
хотя может и сработать
компилятор поймет что b пятерка и подставит значения
0
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 249
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;
};
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
09.08.2012, 03:00 #11
StasGamilton,
здесь ключевое
Цитата Сообщение от Buckstabue Посмотреть сообщение
Такая проблема: инициализировать константы в моём случае можно только через конструктор до тела констутора;
что у тебя и написано
Цитата Сообщение от StasGamilton Посмотреть сообщение
A(int _a) : a(_a) {}
0
StasGamilton
09.08.2012, 03:04
  #12

Не по теме:

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

0
Jupiter
09.08.2012, 09:41
  #13

Не по теме:

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

0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 10:10 #14
Цитата Сообщение от Buckstabue Посмотреть сообщение
чтобы узнать размер картинки надо создавать объект любой картинки из коллекции и методами width(), height() получать необходимые данные, при этом сама картинка не является полем класса.
кто, предполагается, это должен делать? кто будет создавать и т.д.?
сначала нужно вопросы себе задать, зачем классу вообще эти размеры нужны? ведь он вроде с картинками работать будет, без картинки в нем вроде и смысла нет. т.е. картинка всегда под рукой со своими методами width() & height(). зачем дублировать то, что уже есть?
0
DiffEreD
1431 / 768 / 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 пока еще этого не поддерживает.
0
09.08.2012, 10:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2012, 10:30
Привет! Вот еще темы с ответами:

Работа со строчками (как задать поле в конструкторе?) - C++
Здравствуйте, сразу к коду class Shape { private: public: char name; virtual int GetVolume()=0; };...

Как задать размер матрицы в конструкторе класса? - C++
Подскажите как задать размер матрицы в конструкторе класса? Решаю задачи из учебника, не могу понять, думаю это невозможно... Р. Лафоре...

Как проинициализировать структурную переменную в конструкторе класса? - C++
К примеру у меня есть переменная p типа POINT. Такую запись он считает нелегальной: private: POINT p; public: MyClass()...

Как в конструкторе класса передать параметром указатель на функцию? - C++
Друзья! Вот тут всё понятно, есть класс, в котором приватная функция f_0, в конструкторе передаётся указатель на функцию f_1. Эта функция...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.