2013-09-07 2 views
0

이것은 제대로 작동하지 못하는 오버로드 부분입니다.C++ Stringstream 값이 올바르지 않습니까? 결과는 0입니까?

HexColour HexColour::operator+(const HexColour& other) const 
{ 
HexColour temp; 
    stringstream r,g,b; 
    stringstream ro, go, bo; 
    int x, y, z; 
    int xo, yo, zo; 

    r << hex << colour[2] << colour[3]; 
    g << hex << colour[4] << colour[5]; 
    b << hex << colour[6] << colour[7]; 

    r >> x; 
    g >> y; 
    b >> z; 

    ro << hex << other.colour[2] << other.colour[3]; 
    go << hex << other.colour[4] << other.colour[5]; 
    bo << hex << other.colour[6] << other.colour[7]; 

    ro >> xo; 
    go >> yo; 
    bo >> zo; 


    if((x + xo) > 255) 
     x = 255; 
    else 
     x = x + xo; 

    if((y + yo) > 255) 
     y = 255; 
    else 
     y += yo;  

    if((z + zo) > 255) 
     z = 255; 
    else 
     z += xo; 

    cout << x << " anwer" << endl; 
    cout << y << " anwer" << endl; 
    cout << z << " anwer" << endl; 

여기까지 모든 것이 완벽하게 작동합니다. 이것은 문제 부분입니다 :

r << hex << x; // PROBLEM 
    g << hex << y; // PROBLEM 
    b << hex << z; // PROBLEM 

r 값은 0입니다. 왜 그런가요?

cout << hex <<r << endl; 

    temp.colour = "0x" + r.str() + g.str() + b.str(); 

    return temp; 
    } 

위에 인쇄 된 부분은 올바른 정수 값이지만 r은 새로운 16 진수 값이 아닙니다 ?? 사용

+4

안녕하세요. SO! 컴파일하고 분석 할 수 있도록 자급 자족 코드를 게시하십시오. 즉, 주요 기능을 사용하는 주 기능이 제공됩니다. – lpapp

+1

@ LaszloPapp가 방금 말한 것에 따라 확장하십시오 : [SSCCE] (http://sscce.org/) – Borgleader

+0

그리고 평범한 영어로 넣으십시오 : 'colors []'WTF? 또한 : _should_ 일어날 무엇입니까? – sehe

답변

0

지우기 모든 stringstream을 :

r.clear(); 

다음이 도움이 steps-이>

r<<hex<<x; 

희망 반복합니다.

+2

'std :: stringstream :: clear()'는 버퍼를 비 웁니다. 단순히 오류 플래그를 다시 설정합니다. 유용 할 수도 있지만이 함수의 기능에 대해 올바른지 확인하십시오. –

0

IMO, 실제로 두 가지 문제가 있습니다. 먼저 16 진수 문자열을 가능한 한 일종의 정수형으로 변환하면 데이터를 조작하기가 훨씬 쉬워 질 것이므로 모든 내부 코드는 16 진수 문자열이 아닌 정수를 조작해야합니다.

둘째로,이 기능에서 너무 많은 다른 일을하고 있고, 그런 다음 각 일을 3 번 반복하여 상해에 대한 모욕을 추가합니다. 이것을 일부 기능으로 분해하는 것이 훨씬 낫습니다. 각각의 기능은 일관된 동작을 수행합니다. 대신 임의의 운영을 지원하는 HexColor 클래스의

, (당신이 선호하는 경우, 또는 colour) 나는 color을 만들 것 만 사용할 것와 HexColor에서의 전환과 함께, 그 임의의 작업을 지원 클래스 입력과 출력.

클래스의 내부에서 조작은 거대한 획일적 인 코드 조각이 아닌 모든 것을 관리 할 수있는 조각으로 나뉘며 모든 것이 3 번 반복됩니다. 하나 개의 기본적인 질문을 잎

#include <iostream> 
#include <sstream> 
#include <iomanip> 
#include <algorithm> 

class color; 

struct HexColor { 
    std::string colour; 
    HexColor(std::string const &colour) : colour(colour) {} 
    friend std::ostream &operator<<(std::ostream &os, HexColor const &h) { 
     return os << h.colour; 
    } 
    HexColor(color const &); 
}; 

class color { 
    unsigned val; 

    unsigned getr(unsigned in) { return (in >> 0) & 0xff; } 
    unsigned getg(unsigned in) { return (in >> 8) & 0xff; } 
    unsigned getb(unsigned in) { return (in >> 16) & 0xff; } 

    unsigned rgb(unsigned r, unsigned g, unsigned b) { 
     return r | (g << 8) | (b << 16); 
    } 

    unsigned min(unsigned a, unsigned b) { 
     return b < a ? b : a; 
    } 

    unsigned saturating_add(unsigned a, unsigned b) { 
     return min(a + b, 255); 
    } 

public: 
    friend class HexColor; 

    color(unsigned r, unsigned g, unsigned b) : val(rgb(r, g, b)) {} 

    color(HexColor const &h) { 
     std::stringstream temp(h.colour.substr(2, 6)); 
     temp >> std::hex >> val; 
    } 

    color operator+(color const &other) { 
     unsigned r = saturating_add(getr(val), getr(other.val)); 
     unsigned g = saturating_add(getg(val), getg(other.val)); 
     unsigned b = saturating_add(getb(val), getb(other.val)); 
     return color(r, g, b); 
    } 
}; 

HexColor::HexColor(color const &c) { 
    std::stringstream s; 
    s << std::setw(6) << std::setfill('0') << std::setprecision(6) << std::hex << c.val; 
    colour = "0x" + s.str(); 
} 

#ifdef TEST 
int main(){ 
    color a(HexColor("0x010101")); 
    color b(HexColor("0x020202")); 

    std::cout << HexColor(a + b) << "\n"; 

    color c(HexColor("0x123456")); 
    color d(HexColor("0x789abc")); 

    std::cout << HexColor(c+d) << "\n"; 
} 
#endif 

: 아마, 그것은 전혀 HexColor 클래스가하는 것이 합리적이다, 또는 더 의미가 있다면 단지 color 클래스 자체에 기능이 조금 롤 여부 (또는 일부 동일한 네임 스페이스에서 자유로운 기능). 지금 당장은 color이 대부분 조작을하고, HexColor은 I/O를 다루지 만 실제 코드에서는 16 진수를 다루는 operator>>operator<< 만 있으면 오래도록 열심히 생각할 것입니다. 표현, 그리고 다른 모든 것들은 단지 색상을 조작합니다.

관련 문제