Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 미만 연산자(<) 오버로딩으로 상자(Box) 클래스 만들고 부피 계산하기

상자(Box) 클래스 정의하기

C++에서는 여러 조건을 만족하도록 Box(상자) 클래스를 정의해야 하는 경우가 있습니다. 이 글에서는 미만 연산자(<)를 오버로딩하여 두 상자의 크기를 비교하고, 부피를 계산하는 프로그램을 직접 만들어 보겠습니다.

클래스가 충족해야 할 요구 사항은 다음과 같습니다.

  • 길이(l), 너비(b), 높이(h)라는 세 개의 속성을 가집니다. (모두 private 멤버 변수)
  • l, b, h를 0으로 초기화하는 기본 생성자와, 초기값을 전달받는 매개변수 생성자를 각각 정의합니다.
  • 각 속성에 대한 getter 메서드를 제공합니다.
  • 상자의 부피를 반환하는 calculateVolume() 함수를 정의합니다.
  • 미만 연산자(<)를 오버로딩해 현재 상자가 다른 상자보다 작은지 판단합니다.
  • 지금까지 생성된 상자의 개수를 세는 변수를 만듭니다.

예를 들어 세 개의 상자 (0, 0, 0), (5, 8, 3), (6, 3, 8)를 생성하여 각 상자의 데이터를 출력하고, 세 번째 상자가 두 번째 상자보다 작은지 검사한 뒤, 더 작은 상자의 부피를 계산하고, count 변수로 총 생성된 상자 개수까지 함께 출력한다고 가정해 보겠습니다.

그렇다면 실행 결과는 아래와 같습니다.

Box 1: (length = 0, breadth = 0, width = 0)
Box 2: (length = 5, breadth = 8, width = 3)
Box 3: (length = 6, breadth = 3, width = 8)
Box 3 is smaller, its volume: 120
There are total 3 box(es)

문제 해결 접근 방법

위 문제는 다음 단계를 따라 해결할 수 있습니다.

  • 부피를 계산하려면 l * b * h 값을 반환하면 됩니다.
  • 미만 연산자(<)를 오버로딩하려면 아래 규칙에 따라 비교해야 합니다.
  • 현재 객체의 l이 다른 객체의 l과 같지 않다면,
    • 현재 객체의 l이 더 작은 경우 true를 반환합니다.
  • 그렇지 않고 b가 서로 다르다면,
    • 현재 객체의 b가 더 작은 경우 true를 반환합니다.
  • 마찬가지로 h가 서로 다르다면,
    • 현재 객체의 h가 더 작은 경우 true를 반환합니다.

정리하면, 길이 → 너비 → 높이 순서로 처음 차이가 나는 항목을 기준으로 대소 관계를 결정하는 사전식(lexicographic) 비교 방식입니다. 이렇게 하면 세 속성을 모두 고려한 일관된 비교가 가능합니다.

구현 예제

아래 예제 코드를 통해 더 자세히 이해해 보겠습니다.

#include <iostream>
using namespace std;
class Box {
    int l, b, h;
public:
    static int count;
    Box() : l(0), b(0), h(0) { count++; }
    Box(int length, int breadth, int height) : l(length), b(breadth), h(height) { count++; }
    int getLength() const {return l;}
    int getBreadth() const {return b;}
    int getHeight() const {return h;}
    long long CalculateVolume() const {
        return 1LL * l * b * h;
    }
    bool operator<(const Box& another) const {
        if (l != another.l) {
            return l < another.l;
        }
        if (b != another.b) {
            return b < another.b;
        }
        return h < another.h;
    }
};
int Box::count = 0;
int main(){
    Box b1;
    Box b2(5,8,3);
    Box b3(6,3,8);
    printf("Box 1: (length = %d, breadth = %d, width = %d)\n",b1.getLength(), b1.getBreadth(), b1.getHeight());
    printf("Box 2: (length = %d, breadth = %d, width = %d)\n",b2.getLength(), b2.getBreadth(), b2.getHeight());
    printf("Box 3: (length = %d, breadth = %d, width = %d)\n",b3.getLength(), b3.getBreadth(), b3.getHeight());
    if(b3 < b2){
        cout << "Box 3 is smaller, its volume: " << b3.CalculateVolume() << endl;
    }else{
        cout << "Box 3 is smaller, its volume: " << b2.CalculateVolume() << endl;
    }
    cout << "There are total " << Box::count << " box(es)";
}

입력

b1; b2(5,8,3); b3(6,3,8);

출력

Box 1: (length = 0, breadth = 0, width = 0)
Box 2: (length = 5, breadth = 8, width = 3)
Box 3: (length = 6, breadth = 3, width = 8)
Box 3 is smaller, its volume: 120
There are total 3 box(es)