У меня есть класс цвета RGB с двумя перегруженными операторами сравнения (operator ==). Один для типа self и один для int (HEX).Ошибка перегруженного оператора сравнения [C++ 11]
// this one assigns the value correctly
RGB RGB::operator=(const int hex)
{
this->r = (hex>>16 & 0xFF)/255.0f;
this->g = (hex>>8 & 0xFF)/255.0f;
this->b = (hex & 0xFF)/255.0f;
return *this;
}
//--------------------------------------------------------------------------------------
// also works
bool RGB::operator==(const RGB &color)
{
return (r == color.r && g == color.g && b == color.b);
}
// this is evil
bool RGB::operator==(const int hex)
{
float rr = (hex>>16 & 0xFF)/255.0f;
float gg = (hex>>8 & 0xFF)/255.0f;
float bb = (hex & 0xFF)/255.0f;
// if i uncomment these lines then everything is fine
//std::cout<<r<<" "<<rr<<std::endl;
//std::cout<<g<<" "<<gg<<std::endl;
//std::cout<<b<<" "<<bb<<std::endl;
return (r == rr &&
g == gg &&
b == bb);
}
RGB::RGB(int hex)
{
setHex(hex);
}
inline void RGB::setHex(unsigned hex)
{
r = (float)(hex >> 16 & 0xFF)/255.0f;
g = (float)(hex >> 8 & 0xFF)/255.0f;
b = (float)(hex & 0xFF)/255.0f;
}
... тогда я сравниваю в main.cpp, как:
RGB a = 0x555555;
bool equals = (a == 0x555555); // returns false
Я не знаю, что происходит. Сравнение возвращает значение false, но если я раскомментирую строки std :: cout в определении, то функция работает как ожидалось и возвращает true.
Это также работает без проблем:
RGB a = 0x555555;
RGB b = 0x555555;
bool equals = (a == b); // returns true
Любой имеет идею?
Почему вы используете с плавающей точкой в качестве базового типа для значений RGB? – aryjczyk
Поскольку он упрощает вычисления с помощью цветов (смешивания, преобразования между цветовыми пространствами и т. Д.), А OpenGL принимает цветовые компоненты как плавающие. – plasmacel
@ user2430597 Пожалуйста, разместите определение 'RGB :: RGB (int hex)'. Код [works] (http://coliru.stacked-crooked.com/view?id=d5578037553aa013b07b797457554d17-add99d1eb3698568526b0ba407c61bb0), если вы используете только операторов, которые вы опубликовали. – Praetorian