我需要接受用户的输入,这给我提供了红色,绿色和蓝色三种颜色,并以其相应的颜色打印出来。
输入形式为(255,255,255),每个逗号之间的数字范围为1到3个数字。我想将每个整数分别存储在_red,_green和_blue中,而忽略括号和逗号。
#include "color.h"
#include <string>
#include <iostream>
Color::Color(): _reset{true}{
}
Color::Color(int red, int green, int blue): _red{red}, _green{green}, _blue{blue}, _reset{false}{
}
std::string Color::to_string() const{
return "(" + std::to_string(_red) + "," + std::to_string(_green) + "," + std::to_string(_blue) + ")";
}
std::ostream& operator<<(std::ostream& ost, const Color& color){
if(color._reset==false){
ost << "\033[38;2;" << std::to_string(color._red) << ";" << std::to_string(color._green) << ";" << std::to_string(color._blue) << "m";
}else{
ost << "\033[0m\n";
}
return ost;
}
std::istream& operator>>(std::istream& ist, Color& color){
ist.ignore(1,'(');
ist >> color._red;
ist.ignore(1,',');
ist >> color._green;
ist.ignore(1,',');
ist >> color._blue;
ist.ignore(1,')');
}
有问题的问题在运算符>>超载内。为什么此实现无法按预期工作?
答案 0 :(得分:1)
首先,您的operator >>
重载需要返回流,因为该流在实现中已更改。
以下代码在这里似乎可以正常工作: 我测试了(1,2,3),(0,255,0),(255,255,255),(127,0,1)...
#include <string>
#include <iostream>
struct Color {
int r, g, b;
std::string to_string() const;
};
std::string
Color::to_string() const
{
return
"{" + std::to_string(r) +
"," + std::to_string(g) +
"," + std::to_string(b) + "}";
}
std::istream&
operator>>(std::istream& ist, Color& color)
{
ist.ignore(1,'(');
ist >> color.r;
ist.ignore(1,',');
ist >> color.g;
ist.ignore(1,',');
ist >> color.b;
ist.ignore(1,')');
return ist;
}
int main()
{
Color color;
std::cout << "Insert color: ";
std::cin >> color;
std::cout << color.to_string() << std::endl;
return 0;
}
由于您不会共享其余代码(Color
类/结构的定义),因此可以执行以下操作来验证operator >>
是否正常工作: / p>
在阅读值后立即打印!
std::istream&
operator>>(std::istream& ist, Color& color)
{
ist.ignore(1,'(');
ist >> color.r;
ist.ignore(1,',');
ist >> color.g;
ist.ignore(1,',');
ist >> color.b;
ist.ignore(1,')');
std::cout << r << " " << g << " " << b << std::endl;
return ist;
}
似乎在代码的其他地方,成员变量的值正在更改。