1. Day31
- 알고리즘 코드카타
- C++과 Unreal Engine으로 3D 게임 개발 강의 수강(1-3, 1-4)
- 역량 강화분반 OT(스탠다드반 배정, TA반 & 베이직반 실전반 신청)
- CS50x(0주차, 1주차)
2. CH3 - C++과 Unreal Engine으로 3D 게임 개발(Day31)
- C++ 과 Unreal Engine으로 3D 게임 개발 강의 수강(1-3, 1-4)
- 언리얼 컨텐츠 Migration, C++ 클래스 생성 삭제
- 액터 클래스에 컴포넌트 추가하기
3. 알고리즘 코드카타
4. 스마트 포인터 세션
- 스마트 포인터 종류 및 사용법
- unique_ptr, shared_ptr, weak_ptr
- weak_ptr의 부모와 자식 클래스 경우 사용법(자식의 외부 참조 유지 - 외부에서 자식에 직접 접근 가능)
#include <memory>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
// Character 클래스 내부에서 this의 shared_ptr 얻기 위해 enable_shared_from_this 상속
// 안쓰면 this로 참조시 카운터가 증가해서 순환참조 문제 발생
class Character : public enable_shared_from_this<Character> {
protected:
weak_ptr<Character> parent;
vector<shared_ptr<Character>> children;
string name;
int hp;
public:
Character(const string& n, int h) : name(n), hp(h) {
cout << name << " 생성\n";
}
virtual ~Character() {
cout << name << " 소멸\n";
}
void addChild(shared_ptr<Character> child) {
child->parent = shared_from_this(); // enable_shared_from_this 필요
children.push_back(child);
}
shared_ptr<Character> getParent() {
return parent.lock();
}
virtual void attack() {
cout << name << "이(가) 공격!\n";
}
string getName() { return name; }
};
class Warrior : public Character {
int rage;
public:
Warrior(const string& n, int h, int r)
: Character(n, h), rage(r) {}
void attack() override {
cout << name << "이(가) 분노의 일격! (분노: " << rage << ")\n";
}
void callParent() {
if (auto p = getParent()) {
cout << name << "의 부모: " << p->getName() << "\n";
} else {
cout << name << "은(는) 부모가 없음\n";
}
}
};
int main() {
auto leader = make_shared<Character>("대장", 200);
auto warrior1 = make_shared<Warrior>("전사1", 100, 50);
auto warrior2 = make_shared<Warrior>("전사2", 120, 30);
leader->addChild(warrior1);
leader->addChild(warrior2);
/*
대장 (부모)
│
├─shared──▶ 전사1 (자식)
│ │
│ weak
│ │
│◀────────────┘
│
└─shared──▶ 전사2 (자식)
│
weak
│
◀─────────────┘
*/
warrior1->callParent(); // 전사1의 부모: 대장
warrior2->callParent(); // 전사2의 부모: 대장
leader->attack(); // 대장이(가) 공격!
warrior1->attack(); // 전사1이(가) 분노의 일격! (분노: 50)
cout << "\n--- leader 삭제 ---\n";
leader.reset();
// 대장 소멸
// 이후는 main함수 종료시점에 소멸
// 전사1 소멸
// 전사2 소멸
return 0;
}
## 실행 결과
대장 생성
전사1 생성
전사2 생성
전사1의 부모: 대장
전사2의 부모: 대장
대장이(가) 공격!
전사1이(가) 분노의 일격! (분노: 50)
--- leader 삭제 ---
대장 소멸
전사1 소멸
전사2 소멸
- weak_ptr의 부모와 자식 클래스 경우 사용법(자식의 외부 참조 유지 - 외부에서 자식에 직접 접근 가능)
class Character : public enable_shared_from_this<Character> {
// ... 기존 코드 ...
public:
void commandAllChildren() {
for (auto& child : children) {
child->attack();
}
}
};
int main() {
auto leader = make_shared<Character>("대장", 200);
auto warrior1 = make_shared<Warrior>("전사1", 100, 50);
auto warrior2 = make_shared<Warrior>("전사2", 120, 30);
leader->addChild(warrior1);
leader->addChild(warrior2);
warrior1.reset(); // 외부 참조 제거
warrior2.reset(); // 외부 참조 제거
// leader를 통해서만 접근
leader->commandAllChildren(); // 자식들에게 명령
cout << "\n--- leader 삭제 ---\n";
//main()함수가 끝나기전에 전부 삭제
leader.reset(); // 대장 + 전사들 모두 삭제
return 0;
}
- weak_ptr를 사용하여 순환 참조 문제 해결
- enable_shared_from_this 사용법
5. CS50x(0 주차, 1주차)
6. 내일 계획 : CH3 강의 학습, 알고리즘 문제 집중 CS50x 1주차 마무리