2013-06-08 2 views
-4

저에게 다소 어려운 점을 묻고 싶습니다. 나는 캘린더 타입 프로그램을 만들어야하지만, 오버로드 된 '+ ='연산자를 사용해야합니다.오버로드 된 연산자를 'new'객체와 결합합니다.

는 그래서 이렇게 가고 : 내가 사용 오브젝트 할 때마다

template<typename T1,typename T2,typename T3> //int,int,int 
class T_sort_data{ 

T1 p1; 
T2 p2; 
T3 p3; 

public: 

    T_sort_data(){ 
     cout << "\n\t Constructed at [" << this << "]\n";}; 

/ friend ostream& operator<<(ostream& os,const T_sort_data& obj) // get function 
{ 
    os << "\nDay : " << obj.p1 << " \n"; 
    os << "Month : " << obj.p2 << " \n"; 
    os << "Year : " << obj.p3 << " \n"; 
    return os; 
}*/ 

void set_date(){ 
    int dd,mm,yy; 
    cout << "\n\n\tPlease input the day, the month and the year : \n\n"; 
    cin >> dd >> mm >> yy; 
    p1 = dd; 
    p2 = mm; 
    p3 = yy; 
} 

// validator here, which works ... 

T_sort_data<int,int,int>& operator+=(const T_sort_data<int,int,int>& second) 
{ 
    p1+=second.p1; 
    return *this; 
} 

friend istream& operator>>(istream& is, T_sort_data& obj) // set function 
{ 
    is >> obj.p1; 
    is >> obj.p2; 
    is >> obj.p3; 
    return is; 
} 

~T_sort_data(){ 
    cout << "\n\t Deconstructed [" << this << "]\n";}; 

    }; 

    int main(){ 
T_sort_data<int,int,int> * a = new T_sort_data<int,int,int> ; 
bool more = true; 
    string answ; 

a->set_date(); 
//cin >> a; (this doesn't work) 
    //validator goes here 

//a += a; (this, again, doesn't work) 

delete a; 

return 0; 
    } 

"T_sort_data을;" 이러한 작업은 정상적으로 작동하지만 "T_sort_data * a = new T_sort_data;"를 사용할 때마다 똥이 부딪치게됩니다.

아무도 도와 줄 수 있습니까?

+0

왜 원시 포인터를 사용하고 있습니까? C++ 코드에는 컨테이너의 백엔드를 구현하는 경우를 제외하고는 원시 포인터가 없어야합니다. C++ 변수 수명은 RAII를 기반으로합니다. 객체 인스턴스를 공유하려면 스마트 포인터 나 참조를 사용하고 원시 포인터는 사용하지 마십시오. 원시 포인터는 잠재적 인 버그, 메모리 누출 및 읽을 수없는 API 인터페이스와 같습니다. – Manu343726

답변

2

정확히 무엇이 잘못되어 게시하지 않았으므로 코드에서 추측해야합니다.

실행중인 문제는 개체에 대한 포인터가 아니라 개체에 대한 인스턴스 또는 참조에서 오버로드 된 연산자가 작동한다는 것입니다. 코드가 작동하지 않는 경우 객체에 포인터를 처리합니다. 그래서, 당신의 오버로드 된 연산자를 사용하기 위해, 당신은 예를 들어, 포인터 연산자를 적용하기 전에 (효과적으로 값 자체에 값에 대한 포인터를 가리키는에서 회전) 역 참조해야합니다

cin >> *a; 

또는

*a += *a; 
+0

음 ... 예. 그건 내가 실제로 필요한 것이 었어. 고마워! – user2466678

1

T_sort_data의 변수입니다.

T_sort_data * aT_sort_data에 대한 포인터 유형의 변수입니다.

오버로드 된 연산자는 피연산자가 T_sort_data이 아닌 T_sort_data 유형이어야합니다. 단항 * 연산자를 사용하여 포인터를 역 참조하면 피연산자 유형이 연산자가 예상하는 형식이됩니다.

이것은 매우 기본입니다. intstd::cout의 경우도 마찬가지입니다. http://codepad.org/N07Xckdy

관련 문제