2

나는이 경험이 풍부한 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의 운영자를 활용하는 가장 효율적인/적절한 방법은 무엇입니까? 오버로드 된 연산자를 템플릿 함수로 만드는 것이 내 문제를 해결할 수 있습니까? 아니면 전 완전히 다른 접근 방식을 취해야합니까? 내가 얻을 수있는 도움을 기대합니다. 고마워요.

+1

은 색상 VEC에서 상속 네 compenents을 가지고 있고 또한 멤버 변수 (COL)에서 4 개를 가지고 건가요? – DarenW

+0

첫 번째 코멘트 외에도 공변 리턴 타입이 필요한 것 같지만 C++은 그렇게하지 않는 언어입니다. 템플릿을 고려해야합니다. – DarenW

+0

@DarenW - 첫 번째 댓글에 대해서는 No -하지만 방금 내 논리에서 오류를 지적했다고 생각합니다. Color가 내 벡터 Vec, Col의 첫 번째 세 가지 구성 요소에 대해 수행 된 모든 대수 연산과 유사하게 작동하려면 ... Vec의 연산자가 세 개의 구성 요소에 대해 정의되었으므로 불가능합니다. Im은 템플릿 기능을 향해 기울어 져 있으므로, 하지만 매우 불확실합니다 ... – mike

답변

1

왜 이런 그냥 뭔가 :

#include <cstddef> 

template <size_t N> 
class Vector { 
public: 
    Vector(); 
    friend Vector operator+(const Vector& lh, const Vector& rh); 
//... 
private: 
    double val[N]; 
}; 

typedef Vector<3> Vector3d; 
typedef Vector<4> Color; 
+0

해답을 가져 주셔서 감사합니다.이 솔루션을 완전히 이해하려면 몇 가지 질문이 있습니다. 연산자 +가 이제 친구 함수입니까? 왜 하나가 아닌 두 개의 인수가 필요한가? 또한 typedef는 사용하지 않았습니다. 어떻게합니까? – mike

+0

이것은 operator +를 구현하는 또 다른 방법입니다. 예를 들어 Vector의 외부 함수입니다. typedef는 유형에 대한 새로운 이름을 도입합니다. 그 다음에 "Vectord3d var1, var2; Color var_for_color1;/* etc * /"라고 쓸 수 있습니다. – fghj

+0

알았어요. 고맙습니다. 지금 이걸 테스트 해봐. – mike

관련 문제