2009-08-09 3 views
2

가능한 한 다재다능한 간단한 색상 클래스를 작성하려고합니다.참조가 제대로 지정되지 않은 생성자?

class MyColor { 
private: 
uint8 v[4]; 
public: 
uint8 &r, &g, &b, &a; 

MyColor() : r(v[0]), g(v[1]), b(v[2]), a(v[3]) {} 
MyColor(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) : r(v[0]), g(v[1]), b(v[2]), a(v[3]) { 
    printf("%d, %d, %d, %d\n", red, green, blue, alpha); 
    r = red; 
    g = green; 
    b = blue; 
    a = alpha; 
} 
MyColor(uint8 vec[]) : r(v[0]), g(v[1]), b(v[2]), a(v[3]) { 
    MyColor(vec[0], vec[1], vec[2], vec[3]); 
} 
uint8 operator [](int i) { 
    return v[i]; 
} 
operator const GLubyte*() { 
    return v; 
} 
}; 

그리고 여기에 내가 노력하고있어 코드입니다 : : 다음과 같이 표시됩니다

uint8 tmp[] = {1,2,3,4}; 
MyColor c(tmp); 
printf("%d, %d, %d, %d\n", c.r, c.g, c.b, c.a); 

(나는 MyColor c = {1,2,3,4}했을 수 있다면 내가 좋아했을하지만 난 그게 가능 확실하지 않다 ?

1, 2, 3, 4 
112, 22, 104, 89 

그래서 값 I : 전류 사양) 어쨌든

는,이 출력 t는 2 번째 생성자를 얻는다. 그러나 반환 할 때 ... 그 값은 무작위인가?

r = red은 모두 rv[0]에서 red으로 설정해야합니다. rv[0]에 대한 참조 일 뿐이므로 실제로 동일한 값을 공유합니까? 우주에서 어딘가에 대한 참조의 이상한 재 할당을하고 있지 않을까요?

답변

4

불행히도 C++의 순간에는 생성자 전달을 수행 할 수 없습니다. 문제는 여기에 있습니다 :이 실제로 무엇을

MyColor(uint8 vec[]) : r(v[0]), g(v[1]), b(v[2]), a(v[3]) { 
    MyColor(vec[0], vec[1], vec[2], vec[3]); 
} 

는 회원 벡터 v에 대한 참조를 결합하고 생성자의 본문에 다음 버려되는 임시 MyColor 가치를 창출하는 것입니다.

출력의 두 번째 줄은 구성된 MyColor의 멤버 벡터 v의 가비지 초기 값을 인쇄합니다.

4,을 사용하는 생성자 할당 부분을 분리하여 두 생성자에서 호출하는 것이 좋습니다.

void AssignColorValues(uint8 red, uint8 green, uint8 blue, uint8 alpha) 
{ 
    printf("%d, %d, %d, %d\n", red, green, blue, alpha); 
    r = red; 
    g = green; 
    b = blue; 
    a = alpha; 
} 

MyColor(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) : r(v[0]), g(v[1]),  b(v[2]), a(v[3]) 
{ 
    AssignColorValues(red, green, blue, alpha); 
} 

MyColor(uint8 vec[]) : r(v[0]), g(v[1]), b(v[2]), a(v[3]) 
{ 
    AssignColorValues(vec[0], vec[1], vec[2], vec[3]); 
} 
+0

오! * 그것이하는 일입니다. 내가 그걸 알아봐야 할 것 같아. 우리는 심지어 생성자 전달을 할 수 없습니까? C++의 꽤 멍청한 한계처럼 보입니다. – mpen

+0

대부분의 경우 멤버 함수로 기능을 구분할 수 있으므로 (내 업데이트 참조) 생성자 전달은 여러 생성자의 이니셜 라이저 목록에서 복잡한 표현식을 공유 할 때 큰 이점입니다. 필자는이 기능을 한번 또는 두번 놓쳤으며 곧 출시 될 C++의 새로운 버전에 포함될 것입니다. –

+0

아 .. 그게 어쨌든 나는 결국 끝났지 만 어쨌든 세트 기능이 필요했기 때문입니다. 이중 목적 : – mpen

0

사실 저는 오늘 당신이이 일을 대부분 할 수 있다고 생각합니다. boost :: array는 상수 표현식에서 초기화 될 수 있으므로 그렇게 할 수 있어야합니다. 그러나 당신은 다른 생성자를 제거해야한다고 믿습니다. 할당 연산자가 도움이된다면 유지할 수 있습니다.

관련 문제