Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 779
1

Перегрузка оператора = в структуре

07.11.2014, 16:20. Просмотров 1920. Ответов 20
Метки нет (Все метки)

Есть структура:
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
    /**
     * \brief RGB pixel type.
     */
    template< typename T >
    struct basic_rgb_pixel
    {
        /**
         * \brief Default constructor.  Initializes all components
         * with zeros.
         */
        basic_rgb_pixel()
            : red(0), green(0), blue(0)
        {
        }
 
        /**
         * \brief Constructs rgb_pixel object from \a red, \a green
         * and \a blue components passed as parameters.
         */
        basic_rgb_pixel(T red, T green, T blue)
            : red(red), green(green), blue(blue)
        {
        }
 
        T red;
        T green;
        T blue;
    };
 
    /**
     * The 8-bit RGB pixel type.
     */
    typedef basic_rgb_pixel< byte > rgb_pixel;
Чтоб получить цвет пикселя в 10-СС пишу так:
C++
1
printf(" %d ",image.get_pixel(x,y));
Но мне нужно чтоб можно было присвоить это значения типу int
C++
1
int i = image.get_pixel(x,y));
Для этого нужно перезагрузить метод в структуре, как это сделать ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2014, 16:20
Ответы с готовыми решениями:

Перегрузка операторов в структуре
Почему нельзя использовать перегрузку оператора с использованием this? Или это как раз то...

перегрузка оператора
Как перегрузить оператор , чтобы его можно было использовать для операций присваивания новых...

Перегрузка оператора =
Допустим я имею две перегрузки: Zakaz&amp; operator=(Zakaz&amp;); Zakaz operator=(Zakaz); Когда какая...

Перегрузка оператора /
Здраствуйте сделал перегрузку оператора / матрицы только он не / а * пытался исправить но ничего не...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
20
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
07.11.2014, 16:23 2
Рррровно точно так же, как и в классе. Пишешь свой operator=() и вуаля. Класс и структура различаются только спецификаторами доступа по умолчанию.

Но мне кажется, что здесь тебе нужен не operator=, а operator int.
0
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 779
07.11.2014, 16:31  [ТС] 3
CheshireCat, если перегрузить operator int то можно будет делать int i = image.get_pixel(x,y)); ?

Добавлено через 1 минуту
int i = image.get_pixel(x,y)); если я сейчас так пишу, то выдает ошибку:
C++
1
C:\Users\*****\Desktop\TestC++\Zip\main.cpp|50985|error: cannot convert 'png::basic_rgb_pixel<unsigned char>' to 'int' in initialization|
0
Модератор
3475 / 2599 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
07.11.2014, 16:34 4
Скобку лишнюю убери и не надо ничего перегружать)
2
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 779
07.11.2014, 16:36  [ТС] 5
FIL, это опечатка)
Убрал скобку, ошибка осталась
0
37 / 37 / 25
Регистрация: 30.10.2013
Сообщений: 211
07.11.2014, 16:38 6
tdo22, а можно узнать что ты делаешь вообще, может можно без этого класса/структуры обойтись
допустим чтоб цвет пикселя получить можно использовать стандартную функцию например:
C++
1
2
3
4
int X = 10;
int Y = 10;
HDC hdc = CreateDCA("DISPLAY", NULL, NULL, NULL);
int pix = GetPixel(hdc, X, Y);
где x,y координаты
0
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 779
07.11.2014, 16:47  [ТС] 7
я хочу получить цвет пикселя в .png картинке. Для этого пользуюсь библиотеками LibPng и png++
0
Модератор
3475 / 2599 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
07.11.2014, 16:53 8
Цитата Сообщение от tdo22 Посмотреть сообщение
хочу получить цвет пикселя в .png картинке
Тогда надо смотреть, что get_pixel возвращает (какой тип).
0
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 779
07.11.2014, 16:58  [ТС] 9
FIL, как я понял с ошибки, он возвращает unsigned char.
Тогда я сделал так:
C++
1
unsigned char chr = image.get_pixel(x,y);
Но мне выдало ошибку:
Код
C:\Users\*****\Desktop\TestC++\main.cpp|50985|error: cannot convert 'png::basic_rgb_pixel<unsigned char>' to 'unsigned char' in initialization|
0
37 / 37 / 25
Регистрация: 30.10.2013
Сообщений: 211
07.11.2014, 17:14 10
tdo22, а при работе программы картинка отображается на экране?
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
07.11.2014, 17:22 11
C++
1
2
3
4
operator int()
{
return //что то, как можно представить цвет пикселя в int формате
}
1
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 779
07.11.2014, 17:27  [ТС] 12
Kverter, это консольное приложение.
0
aLarman
07.11.2014, 17:27
  #13

Не по теме:

a не..это не решит проблему :)

0
Модератор
3475 / 2599 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
07.11.2014, 17:33 14
get_pixel возвращает структуру basic_rgb_pixel
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
07.11.2014, 17:36 15
Лучший ответ Сообщение было отмечено tdo22 как решение

Решение

короч
C++
1
2
3
int red = image.get_pixel(x,y).red;
int blue = image.get_pixel(x,y).blue;
int green = image.get_pixel(x,y).green;
1
С чаем беда...
Эксперт CЭксперт С++
8621 / 4300 / 1181
Регистрация: 18.10.2014
Сообщений: 9,339
07.11.2014, 18:36 16
Цитата Сообщение от tdo22 Посмотреть сообщение
Для этого нужно перезагрузить метод в структуре, как это сделать ?
Во-первых, перегрузкой 'operator =' такого добиться не удастся. 'operator =' тут вообще ни при чем. Это можно делать только перегрузкой оператора приведения типа.

Во-вторых, так а как это должно работать? Каким образом пиксель, содержащий в себе три компоненты, должен ложиться в один единственный 'int'???
0
1173 / 886 / 94
Регистрация: 03.08.2011
Сообщений: 2,457
07.11.2014, 19:05 17
TheCalligrapher, ну как вариант каждый байт под цвет, а четвертый под альфа.
0
С чаем беда...
Эксперт CЭксперт С++
8621 / 4300 / 1181
Регистрация: 18.10.2014
Сообщений: 9,339
07.11.2014, 19:39 18
Цитата Сообщение от Toshkarik Посмотреть сообщение
каждый байт под цвет, а четвертый под альфа
Ну, во-первых, я не вижу в исходном классе никаких "байтов". Класс описан, как шаблонный, с типом значения, задаваемым параметром 'T'. Т.е. очевидно, что специально заложена возможность того, что 'red', 'green' и 'blue' - это отнюдь не "байты". Поэтому ожидать на уровне этого шаблонного класса, что все три значения поместятся в 'int' в общем случае не приходится.

Более того, раз уж вы собрались паковать несколько значений в целое число, то за использование знакового целевого типа надо вообще сразу отправлять на сельхозработы. Для любых операций битового уровня - только беззнаковые типы (за исключением специальных случаев).

Во-вторых, в классе нет никакой "альфы". Только 'red', 'green' и 'blue'.

В-третьих, как вариант, это может выглядеть так (для "байтов")

C++
1
2
3
4
5
6
7
template< typename T >
struct basic_rgb_pixel
{
  ...
  operator unsigned int() const { return ((red << 8) + green) << 8 + blue; }
  ...
};
Однако такой оператор будет неявно вызываться для приведения к любым целочисленным типам, независимо от их размера, что чревато неожиданными ошибками. Я бы рекомендовал в С++11 объявить его, как explicit, чтобы минимизировать вероятность ненамеренного применения этого оператора.

А лучше - забыть об этой идее совсем. Как я сказал ваш шаблонный класс содержит неизвестные типы, а не "байты". Поэтому функциональности "упаковки в единственное целое" у него в общем случае быть не может.
0
1173 / 886 / 94
Регистрация: 03.08.2011
Сообщений: 2,457
07.11.2014, 20:07 19
TheCalligrapher, именно в этом примере используется unsigned char. Я предложил вариант, который может быть промежуточным для дальнейшего использования. Если альфа не используется в структуре это не означает, что она не используется в программе. Это выглядит вполне логично, не считая, конечно, знаковый тип.
0
С чаем беда...
Эксперт CЭксперт С++
8621 / 4300 / 1181
Регистрация: 18.10.2014
Сообщений: 9,339
07.11.2014, 20:21 20
Цитата Сообщение от Toshkarik Посмотреть сообщение
именно в этом примере используется unsigned char.
Да, но класс 'template< typename T > struct basic_rgb_pixel' ничего не знает и не должен знать об "именно этом примере". Никто в здравом уме не будет корежить дизайн универсального класса ради какого-то постороннего частного примера. Если вы собираетесь что-то вписывать прямо в класс, то оно должно работать для всех типов 'T'.

Если вы хотите сделать что-то специфичное для 'basic_rgb_pixel<unsigned char>', то для этого придется завести отдельный, более специализированный класс, построенный на базе 'basic_rgb_pixel<T>'.

Цитата Сообщение от Toshkarik Посмотреть сообщение
Если альфа не используется в структуре это не означает, что она не используется в программе.
Я говорю лишь и только реализации 'operator ='. Этой реализации никакая "альфа" не доступна. А что там еще есть где-то в программе - к рассматриваемому вопросу преобразования 'basic_rgb_pixel' в 'int' не относится.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2014, 20:21

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Перегрузка оператора ++
выводит не то значение привет. нужна Ваша подсказка. листинг из учебника: (тема: перегрузка...

Перегрузка оператора []
Здравствуйте. Пробую перегрузить оператор . template &lt;class Element&gt; class List { public:...

Перегрузка оператора []
Есть: class any{ char arr }

Перегрузка оператора
Доброго времени суток. Столкнулся с проблемой перегрузки оператора &quot;++&quot; выдает ошибку в первой...


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

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

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