2025.12.22

박민재 (Daype)·2025년 12월 22일

과제 4 필수기능 가이드 구현일지

구현목표 : 레시피 검색기능 추가

  • 물약 이름 검색시 해당 레시피 출력
  • 레시피 재료 검색시 해당 재료가 들어간 모든 레시피 출력


반환형이 레시피 클래스 타입인 함수를 생성하여 내부를 구현
첫번째로 없는 벡터를 읽으려고 할시 vector out of range 에러가 나는것을 확인
해당 에러는 할당된 벡터의 사이즈를 벗어난 값을 읽으려고 시도할 시 발생
예외처리를 해주어야 함 클래스 내부의 레시피벡터가 비어있는지 확인 후 비어있지않은경우에만
실행 할 수 있도록 예외처리 추가 일반적인 find 함수를 사용할 시 매개변수로 받은 찾는 요소를 벡터안에 있는 값과 비교하는게 불가능함. 비교연산자 == 인식불가 때문에 find if 함수와 람다식을 이용하여 직접 매개변수와 일치하는 지 구현해주었고 같을시에 값이 it에 대입되도록 구현
그런다음 못찾았을경우에는 반환을 하면 안되기 때문에 찾았을 경우에만 해당 인덱스에 해당하는 레시피 클래스를 반환하도록 구현

해당 반환값은 메인함수 부분에 동작부분에서 해당 클래스 지역변수를 생성해서 저장해주고
내가 입력한 이름과 해당레시피가 갖고있는 이름이 동일한경우(물약이름으로 레시피를 찾은경우)
해당 레시피의 포션이름과 필요한 재료를 모두 출력할 수 있도록 구현 못찾을시 예외처리도 구현


  • 재료검색시 해당 재료가 포함된 모든 레시피 출력

워크숍 인벤토리 클래스 내부
들어온 입력값이 있는지 확인 실제동작은 입력한 재료가 포함된 모든 벡터를 반환해야하므로

레시피 타입의 새로운 지역변수를 생성하고
현재 존재하는 레시피안에 모든요소를 recipe 변수에 옮겨 담기
이후 recipe의 모든 재료중에 매개변수로 받은 재료와 일치하는 재료가 있는지 확인
일치하는 재료가 존재한다면 새로운 벡터에 넣고 반환
const auto& for문에 해당하는 부분의 개념을 새로 이해
recipes의 새로운 별명 recipe를 붙여 참조 즉 recipes 안에있는 모든 값에 접근할 수 있다.
때문에 벡터안에 potionRecipe타입에 접근이 가능하여 ._ingredients 요소에 접근할 수 있게되는것이다.

마찬가지로 반환된 값이 있는경우가 재료가 있다는 뜻이기때문에 반환값이 있을때만 동작하도록 조건문 생성 후 조건문진입시 레시피의 이름은 고유한 1개이기 때문에 레시피의 크기만큼 반복문
이후 레시피의 보유재료는 각각 다르기때문에 해당인덱스에 해당하는 레시피의 재료의 크기만큼 반복문 이미 반환값으로 검증된 레시피이기때문에 보유하고있는재료 모두 출력

추가로 람다식에관해서도 새로운 개념을 확립했다.

auto it = find_if(recipes.begin(), recipes.end(), [&](const PotionRecipe& obj) {
	return obj.potionName == name;

해당구문에 3번째 인자를 확인해보면 [&]람다식이 있는걸 알 수 있는데 우선 [&]은 외부참조 변수를 가져오겠다는의미이다. 이어서 설명하자면 (const PotionRecipe& obj) 이것은
현재 레시피벡터 안에있는 PotionRecipe 요소 하나 하나를 obj 라는 별명을 붙여서 참조하겠다 라는의미이고 [&]외부에 이것이 포함되어있기때문에 외부 변수도 참조해서 쓰겠다 라는 뜻이다.
그리고 람다식 내부는 obj에 내부변수인 PotionName이 외부매개변수인 name 과 같으면 find_if에게 true 를 반환하게되고 find_if가 람다식으로부터 true를 전달받으면 해당 요소를 반복자에 저장한다는 의미이다.

0개의 댓글