나는이 경험이 풍부한 C++ 프로그래머가 아니며이 포럼에 익숙하지 않다. 이 첫 번째 게시물이 규칙을 따르기 바랍니다.연산자 오버로딩으로 서브 클래 싱하기 C++
내 목표는 간단한 광선 추적기를 쓰는 것이지만, 수업 중 하나를 확장하는 방법에 붙어 있습니다. 문제는 연산자 오버로딩뿐만 아니라 디자인 패턴 (나는 생각한다)에있다. 여기 내 코드입니다 :
class Vec{ //My vector class
protected:
double v[4]; //Fourth element not used...
public:
Vec();
Vec (double i, double j, double k);
Vec operator+ (const Vec& vec) const;
Vec operator- (const Vec& vec) const;
Vec & operator+=(const Vec& vec);
Vec & operator-=(const Vec& vec);
double operator*(const Vec& vec) const;
Vec operator*(double scalar);
//get operator
double& operator[](unsigned int i);
double operator[](unsigned int i) const;
//Vector assignment operator
Vec Vec::operator=(const Vec& vec);
//Scalar assignment operator
Vec Vec::operator=(double scalar);
};
Vec Vec::operator+(const Vec& vec) const{
return Vec(v[0]+vec.v[0], v[1]+vec.v[1], v[2]+vec.v[2]);
}
그리고
class Color : public Vec{
protected:
Vec col; //A Color should use all four elements in the array
//I.e Vec color(R,G,B,specular);
public:
//Vec Color::operator+(const Vec& vec) const; <-- this is wrong i know.
};
그냥 철저하기, 나는 주에서이 작업을 수행 :
Color myColor(1.2, 1.3, 2.3, 40);
Color myColor2(2.2, 3.4, 3.3, 30);
cout << (myColor+myColor2) << std::endl;
프로그램은 출력을 반환하는 VEC() 기본 생성자를 호출 (0,0,0)
이것은 분명히 잘못되었습니다 ....
편집 : Vec 클래스는 다음과 같은 값을 저장합니다.
Vec::Vec() {
v[0] = 0; v[1] = 0; v[2] = 0;
}
Vec::Vec (double i, double j, double k) {
v[0] = i; v[1] = j; v[2] = k;
}
모든 오버로드 된 연산자는 double v[4]
작업과 VEC에게 사본 또는 기준 중 하나를 반환합니다.
질문 : Color가 Vec의 운영자를 활용하는 가장 효율적인/적절한 방법은 무엇입니까? 오버로드 된 연산자를 템플릿 함수로 만드는 것이 내 문제를 해결할 수 있습니까? 아니면 전 완전히 다른 접근 방식을 취해야합니까? 내가 얻을 수있는 도움을 기대합니다. 고마워요.
은 색상 VEC에서 상속 네 compenents을 가지고 있고 또한 멤버 변수 (COL)에서 4 개를 가지고 건가요? – DarenW
첫 번째 코멘트 외에도 공변 리턴 타입이 필요한 것 같지만 C++은 그렇게하지 않는 언어입니다. 템플릿을 고려해야합니다. – DarenW
@DarenW - 첫 번째 댓글에 대해서는 No -하지만 방금 내 논리에서 오류를 지적했다고 생각합니다. Color가 내 벡터 Vec, Col의 첫 번째 세 가지 구성 요소에 대해 수행 된 모든 대수 연산과 유사하게 작동하려면 ... Vec의 연산자가 세 개의 구성 요소에 대해 정의되었으므로 불가능합니다. Im은 템플릿 기능을 향해 기울어 져 있으므로, 하지만 매우 불확실합니다 ... – mike