티스토리 뷰
강의 : https://modoocode.com/252
씹어먹는 C ++ - <13 - 2. 자원을 공유할 때 - shared_ptr 와 weak_ptr>
modoocode.com
위 강의의 문제를 풀어본 내용입니다. 다만, 아직 촌수 계산은 미구현 상태입니다.
예시
더보기
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include "Member.h"
int main() {
std::shared_ptr<Member> m0 = std::make_shared<Member>("A");
std::shared_ptr<Member> m1 = std::make_shared<Member>("B");
std::shared_ptr<Member> m2 = std::make_shared<Member>("C");
std::shared_ptr<Member> m3 = std::make_shared<Member>("D");
std::shared_ptr<Member> m4 = std::make_shared<Member>("E");
std::shared_ptr<Member> m5 = std::make_shared<Member>("F");
std::shared_ptr<Member> m6 = std::make_shared<Member>("G");
m0->AddSpouse(m1);
m0->AddChild(m2);
m0->AddChild(m3);
m1->AddSpouse(m0);
m1->AddChild(m2);
m1->AddChild(m3);
m3->AddSpouse(m4);
m3->AddChild(m5);
m3->AddChild(m6);
m4->AddSpouse(m3);
m4->AddChild(m5);
m4->AddChild(m6);
FamilyTree ft;
ft.AddFamily(m0);
ft.AddFamily(m1);
ft.AddFamily(m2);
ft.AddFamily(m3);
ft.AddFamily(m4);
ft.AddFamily(m5);
ft.AddFamily(m6);
std::cout << "실행" << std::endl;
ft.ShowFamilyTree();
std::cout << "CalculateChon between 0 and 0 : " << ft.CalculateChon(&(*ft.entire_family[0]), &(*ft.entire_family[1])) << std::endl;
}
Member.h
#pragma once
#include <iostream>
#include <vector>
#include <memory>
#include <string>
class Member : public std::enable_shared_from_this<Member> {
private:
std::vector<std::shared_ptr<Member>> children;
std::vector<std::weak_ptr<Member>> parents;
std::vector<std::weak_ptr<Member>> spouses;
std::string name;
public:
friend class FamilyTree;
Member(std::string name) : name(name) {}
// 복사 생성자 삭제
Member(const Member& member) = delete;
~Member() { std::cout << " 삭제" << std::endl; }
void AddParent(const std::shared_ptr<Member>& parent);
void AddSpouse(const std::shared_ptr<Member>& spouse);
void AddChild(const std::shared_ptr<Member>& child);
void ShowParent();
void ShowSpouse();
void ShowChild();
const std::vector<std::shared_ptr<Member>> getChildren() const { return children; }
const std::vector<std::weak_ptr<Member>> getParents() const { return parents; }
const std::vector<std::weak_ptr<Member>> getSpouse() const { return spouses; }
const std::string getName() const { return name; }
public:
bool operator==(const std::shared_ptr<Member>& member);
};
class FamilyTree {
public:
std::vector<std::shared_ptr<Member>> entire_family;
public:
// 추가
bool AddFamily(const std::shared_ptr<Member>& family);
void ShowFamilyTree();
// 두 사람 사이의 촌수를 계산한다. 아직 미구현
int CalculateChon(Member* m1, Member* m2);
};
Member.cpp
#include "Member.h"
void Member::AddParent(const std::shared_ptr<Member>& parent)
{
parents.push_back(parent);
}
void Member::AddSpouse(const std::shared_ptr<Member>& spouse)
{
spouses.push_back(spouse);
}
void Member::AddChild(const std::shared_ptr<Member>& child)
{
child->AddParent(this->shared_from_this());
children.push_back(child);
}
void Member::ShowParent()
{
if (!parents.empty()) {
for (std::weak_ptr<Member> p : parents) {
std::shared_ptr<Member> tmp = p.lock();
std::cout << this->getName() << "'s Parent : " + tmp->getName() << std::endl;
}
}
}
void Member::ShowSpouse()
{
if (!spouses.empty()) {
for (std::weak_ptr<Member> s : spouses) {
std::shared_ptr<Member> tmp = s.lock();
std::cout << this->getName() << "'s Parent : " + tmp->getName() << std::endl;
}
}
}
void Member::ShowChild()
{
if (!children.empty()) {
for (std::shared_ptr<Member> c : children) {
std::cout << this->getName() << "'s Parent : " + c->getName() << std::endl;
}
}
}
bool Member::operator==(const std::shared_ptr<Member>& member)
{
if (member->getName() == this->getName())
return true;
return false;
}
bool FamilyTree::AddFamily(const std::shared_ptr<Member>& family)
{
for (std::shared_ptr<Member> t1 : entire_family) {
if (t1 == family) {
std::cout << "이미 들어와있는 가족입니다." << std::endl;
return false;
}
}
entire_family.push_back(family);
return true;
}
void FamilyTree::ShowFamilyTree()
{
for (std::shared_ptr<Member> e : entire_family) {
e->ShowChild();
e->ShowParent();
e->ShowSpouse();
}
}
int FamilyTree::CalculateChon(Member* m1, Member* m2)
{
if (m1 == nullptr || m2 == nullptr)
return -1;
for (std::shared_ptr<Member> c : m1->getChildren()) {
if (c->getName() == m2->getName())
return 1;
}
for (std::weak_ptr<Member> p : m1->getParents()) {
std::shared_ptr<Member> p1 = p.lock();
if (p1->getName() == m2->getName())
return 1;
}
std::shared_ptr<Member> s = m1->getSpouse()[0].lock();
if (s->getName() == m2->getName())
return 1;
return -1;
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
placement new문법(객체 초기화) (0) | 2023.03.27 |
---|---|
shared_ptr 구현기 - 1일차 (0) | 2023.03.27 |
C++) STL 목차 정리 (0) | 2022.11.24 |
씹어먹는 C++) SpinLock 구현 및 15-3-1 문제 풀이 (0) | 2022.11.22 |
씹어먹는 C++) 간단한 unique_ptr 구현 (0) | 2022.11.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 개발
- 정보보안
- BFS
- 자료구조
- 백준
- 더블버퍼링
- 야경
- 학교
- 멀티쓰레드
- Select모델
- 시스템보안
- 링크드 리스트
- c++
- 레지스터
- 드림핵
- 컨퍼런스
- queue
- 지뢰찾기
- 워셜알고리즘
- STL
- 보안
- 고양이
- 알고리즘
- Dreamhack
- 스레드풀
- 인제대학교
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
글 보관함