요약: 비밀 상자
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 21번째.
챌린지
쉬움완전한 캡슐화를 보여 주는 Box 모듈을 만들어 보겠습니다. 여러분의 box에는 width, height, depth라는 세 개의 숨겨진 dimension이 있으며, 여러분이 제공하는 function을 통해서만 접근할 수 있습니다. 이것이 바로 완전한 opaque pointer 패턴의 실제 적용입니다!
세 개의 파일을 만듭니다:
box.h: 공개 인터페이스입니다. 정방향 선언만 사용하여 불투명한Boxtype을 Declare합니다. struct 본문은 숨겨진 상태로 유지됩니다. 다음 function을 Declare합니다:create_box: 세 개의 integers (width, height, depth)를 받고 Box pointer를 반환합니다destroy_box: Allocate된 memory를 Free합니다get_volume:const Box *를 받고 volume (width × height × depth)을 반환합니다set_dimensions: Box pointer와 세 개의 새로운 dimension 값을 받고,int를 반환합니다 (성공하면 1, 어떤 dimension이든 negative 또는 zero이면 0)
BOX_Hsymbol을 사용하여 include guard를 사용하세요.box.c: 세 개의 숨겨진 members인int width,int height,int depth를 가진 실제struct Box를 Define합니다. 네 function을 모두 Implement합니다. constructor는 box를 Allocate하고 initialize해야 합니다.set_dimensionsfunction은 변경 사항을 적용하기 전에 세 값이 모두 positive (zero보다 greater)인지 검증해야 하며, 하나라도 검증에 fails하면 전체 update를 거부하고 0을 반환해야 합니다.main.c: 캡슐화된 Box를 하나 Create하고, volume을 확인하고, dimension 변경을 (유효한 경우와 유효하지 않은 경우 모두) 시도한 다음, 올바르게 정리하는 과정을 보여 줍니다.
다섯 개의 input을 받습니다. initial width, initial height, initial depth와, 이어서 설정을 시도할 세 개의 새로운 dimensions입니다 (유효하지 않은 값이 포함될 수도 있습니다).
main file에서 initial dimensions로 Box를 Create하고 volume을 출력하세요. 그런 다음 새로운 dimensions 설정을 시도합니다. update가 성공했는지와 resulting volume을 출력하세요. 마지막으로 box를 Free하고 cleanup을 확인하세요.
다음 format으로 output을 출력하세요:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
Destroyed예를 들어 input이 2, 3, 4, 5, 5, 5인 경우 output은 다음과 같습니다:
Volume: 24
Set: 1
Volume: 125
Destroyedinput이 2, 3, 4, -1, 5, 5인 경우 output은 다음과 같습니다:
Volume: 24
Set: 0
Volume: 24
Destroyedset_dimensions의 validation이 invalid state로부터 box를 어떻게 보호하는지 확인하세요. dimensions가 interface 뒤에 완전히 숨겨져 있으므로 external code는 여러분의 rules를 우회할 수 없습니다.
직접 해보기
#include <stdio.h>
#include "box.h"
int main() {
// 초기 치수 읽기
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// 시도할 새 치수 읽기
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: 초기 치수로 Box 생성
// TODO: 초기 부피를 다음 형식으로 출력: "Volume: {volume}"
// TODO: 새 치수 설정을 시도하고 결과를 저장
// TODO: 설정 성공 여부를 다음 형식으로 출력: "Set: {0 or 1}"
// TODO: 결과 부피를 다음 형식으로 출력: "Volume: {volume}"
// TODO: box를 파괴하고 "Destroyed" 출력
return 0;
}
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러