2017-10-17 4 views
-1

그래서 C++ 코딩에 상당히 익숙하며 현재 프로그래밍 과정에서 연산자 오버로딩 및 friend 함수에 대해 배우고 있습니다. 우리는 생성자와 오버로딩 된 연산자의 종류가 다른 클래스 Money를 만들라고 들었습니다. 이 프로그램은 개인 멤버 변수에 대한 포인터가 없었 더라면 훨씬 쉬웠지만, 지금은 약간 이상합니다.오버로드 된 연산자와 멤버 포인터를 사용할 때 세그먼트 오류

나머지 오버로드 된 연산자 함수를 정의하기 전에 이에 대한 도움이 필요했습니다. 기본적으로 나는 Money 클래스의 두 객체를 함께 추가하지만, 프로그램을 실행할 때 세그먼트 오류가 계속 발생합니다. 이 포인터와 액세스 할 수없는 메모리에 액세스 할 수있다 알지만, 내가 잘못 된지 모르겠습니다.

지금까지는 짧은 프로그램이므로 코드를 읽기 쉬워야합니다. 어떤 도움을 주시면 감사하겠습니다!

class Money 
{ 
public: 
     Money(int d=0, int c=0); 
     Money(const Money&); 
//  ~Money(); 

     Money& operator=(const Money&); 
     Money operator+(const Money&) const; 
     Money operator-(const Money&) const; 
     Money& operator*(double); 
     Money& operator/(double); 

     friend istream& operator>>(istream&, Money&); 
     friend ostream& operator<<(ostream&, const Money&); 
private: 
     int* dollars; 
     int* cents; 
}; 

int main() 
{ 
     Money m1(3, 43), m2(4, 64); 

     Money m3 = m1 + m2; 

     return 0; 
} 

Money::Money(int d, int c) 
{ 
     *dollars = d; 
     *cents = c; 
} 


Money Money::operator+(const Money& m1) const 
{ 
     Money result; 
     *result.dollars = *this->dollars + *m1.dollars; 
     *result.cents = *this->cents + *m1.cents; 
     return result; 
} 
+1

왜 달러와 센트를 정수에 대한 포인터로 정의합니까? 그건 나쁜 생각이야. 실제로 초기화하지 않고 이러한 정수를 사용하려고 시도합니다 (포인터를 derefence). – NineBerry

+1

달러와 센트에 int *를 사용해야합니까? 할당이 허용하는 경우 일반 int를 대신 사용하십시오. – Darryl

+1

달러와 센트에 int에 대한 포인터를 사용해야합니다. 내가 할 수 있으면 좋겠다! 동적 메모리 할당에 대한 자세한 내용은 아직 배울 수 있습니다. –

답변

2

당신은 dollarscents 메모리를 할당하지 않았습니다. 당신은 당신의 생성자에서이 작업을 수행해야합니다

Money::Money(int d, int c) 
{ 
    dollars = new int; 
    cents = new int; 

    *dollars = d; 
    *cents = c; 
} 

그리고 소멸자에서 메모리를 해제하는 것을 잊지 마세요 : 그렇지 않으면

Money::~Money() { 
    delete dollars; 
    delete cents; 
} 

을, 당신은 단순히 당신이 (int의 두 포인터를 선언했습니다 dollarscents) 실제로 메모리의 유효한 지점을 가리 키지는 않았습니다. 그들은 초기화되지 않았습니다.

힌트 : 복사 생성자 (Money(const Money&)) 및 연산자를 구현할 때이 리소스 관리를 염두에 두십시오 (철저히 확인해 주셔서 감사합니다 @LokiAstari).

+1

대단히 감사합니다. 나는 포인터에 관해서 많은 것을 배우고 있고 나는 이것을 완전히 건너 뛰었을 것 같다. –

+1

@DaneWind 왜 간단한 'int'변수에 대한 포인터가 필요한가요? – user0042

+1

이 조언은 문제를 악화시킵니다. –