c++ 연산자 오버로딩 무엇이 잘못되었는지 좀 알려주세요

조회수 2027회

연산자 오버로딩을 하면서 + 부분을 구현하는데 안되더라구요 확인차원에서 일반적으로 때려 박아 봤는데 역시나 안되서 글남겨봅니다. 문법문제인거 같은데 저가 C++처음이라 잘모르겠습니다. +연산자 보시고 +부분만 왜틀렸는지 설명 부탁드리겠습니다.

#include <iostream>
using namespace std;

class IntegerSet {
    int numElements, maxNumElements;
    int *elements;
public:

    IntegerSet(int max) {
        numElements = 0;
        maxNumElements = max;
        elements = new int[max];
    }
    ~IntegerSet(); // to implement
    int addAnElement(int element); // add an integer element, to implement 
    IntegerSet operator+(const IntegerSet& other); // union, to implement
    IntegerSet operator-(const IntegerSet& other); // difference, to implement
    IntegerSet operator*(const IntegerSet& other); // intersection, to implement
    friend ostream& operator<<(ostream& os, const IntegerSet& integerSet);

};

IntegerSet::~IntegerSet() {
    delete(elements);
}

int IntegerSet::addAnElement(int element) {
    if (numElements < maxNumElements) {
        elements[numElements] = element;
        numElements++;
        return 0;
    }
    else
        return -1;
}

//여기 왜 안되죠?
IntegerSet IntegerSet::operator+(const IntegerSet& other) {
    IntegerSet temp(5);
    temp.addAnElement(22);
    return temp;
}

ostream& operator<<(ostream& os, const IntegerSet& integerSet) {
    cout << "number of elements : " << integerSet.numElements << "\n";
    for (int i = 0;i<integerSet.numElements;i++)
        cout << integerSet.elements[i]<<" ";
    cout << "\n";
    return os;
}

int main() {
    IntegerSet a(10), b(5);
    int i;
    for (i = 0;i < 5;i++) {
        a.addAnElement(i);
        b.addAnElement(10 - i);
    }
    cout << a << endl;
    cout << b << endl;

    IntegerSet c = a + b;

    return 0;
}
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 컴파일은 되는 것 같은데..., 연산자 + 로 무엇을 하고자 하는 건가요? 허대영(소프트웨어융합대학) 2016.4.24 07:17
  • 목표는 각각의 집합에 있는 숫자를 합하는걸 만들려고 하고있습니다. 근데 저도 컴파일은 되는데 실행하면 멈추더라구요 그래서 문법에서 문제가 있을거란 생각에 문법 테스트를 위해 위와같이 작성했습니다. 알 수 없는 사용자 2016.4.24 10:47

1 답변

  • 문법에 문제가 있었다면, 컴파일이 안되는게 정상입니다.

    함수 로직을 한번 살펴보는게 어떨까요?

    질문에 올려주신 operator+는 프로그램 코드 상으로 별 문제가 없습니다.

    실제 해보신 코드가 아니라고 생각되는 데요. 원래 가지신 로직에서 루프의 탈출 조건 등을 살표보는게 좋을것 같습니다.

    그리고 첨삭하자면, 복사생성자를 정의해야 제대로 동작할 것 같습니다.

    기본 복사 생성자는 다음과 같습니다.

    • 객체간의 변수의 값을 복사 --> 얕은 복사, 위 경우 new 로 만든 포인터를 공유하게됨.

    복사 생성자의 호출 시점은 다음과 같습니다.

    • 객체의 선언과 동시에 초기화 될 때
    • 함수에 매개변수로 객체를 전달할 때 ( Call by Value 경우 )
    • 반환값으로 객체를 반환할 때. --> 여기에 해당하는데 --> 동적할당을 하고 있으므로 깊은 복사가 필요함으로 복사생성자를 만들어주세요.
    • 답변 정말 감사합니다. 복사생성자를 추가하니 정상적으로 돌아가네요 알 수 없는 사용자 2016.4.29 16:05

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)