티스토리 뷰

강의 : 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;
}

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함