-
Notifications
You must be signed in to change notification settings - Fork 78
/
Composite.cpp
134 lines (114 loc) · 3.36 KB
/
Composite.cpp
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include<algorithm>
#include<iostream>
#include<memory>
#include<string>
#include<vector>
class FileSystem
{
public:
explicit FileSystem(std::string name) : name_(std::move(name)) {}
virtual ~FileSystem() = default;
virtual int GetSize() const = 0;
virtual FileSystem* Add(std::unique_ptr<FileSystem>&& filesystem)
{
(void)filesystem;
throw std::logic_error("Add() is not supported operation.");
}
virtual void Remove() = 0;
std::string GetName() const { return name_; }
private:
std::string name_;
};
class File : public FileSystem
{
public:
File(std::string const& name, std::uint64_t size) : FileSystem(name), size_(size) {}
int GetSize() const override
{
return size_;
}
void Remove() override
{
std::cout << GetName() << " 파일 삭제" << std::endl;
}
private:
int size_;
};
class Folder : public FileSystem
{
public:
explicit Folder(const std::string& name) : FileSystem(name) {}
int GetSize() const override
{
int total = 0u;
for (auto const& included : includeds)
{
total += included->GetSize();
}
std::cout << GetName() << " 폴더 크기 : " << total << std::endl;
std::cout << "- - - - -" << std::endl;
return total;
}
FileSystem* Add(std::unique_ptr<FileSystem>&& data) override
{
includeds.push_back(std::move(data));
return includeds.back().get();
}
void Remove() override
{
for (auto const& included : includeds)
{
included->Remove();
}
std::cout << GetName() << " 폴더 삭제" << std::endl;
std::cout << "- - - - -" << std::endl;
}
private:
std::vector<std::unique_ptr<FileSystem>> includeds;
};
int main()
{
auto schoolFolder = std::make_unique<Folder>("학교");
auto grade1Folder = schoolFolder->Add(std::make_unique<Folder>("1학년"));
auto grade2Folder = schoolFolder->Add(std::make_unique<Folder>("2학년"));
auto enterPhoto = grade1Folder->Add(std::make_unique<File>("입학사진", 256));
auto sem1Folder = grade2Folder->Add(std::make_unique<Folder>("1학기"));
auto sem2Folder = grade2Folder->Add(std::make_unique<Folder>("2학기"));
auto lecturePlan = sem1Folder->Add(std::make_unique<File>("강의계획서", 120));
auto projectFolder = sem2Folder->Add(std::make_unique<Folder>("프로젝트"));
auto draft = projectFolder->Add(std::make_unique<File>("드래프트", 488));
auto finalResult = projectFolder->Add(std::make_unique<File>("결과물", 500));
schoolFolder->GetSize();
/*
1학기 폴더 크기 : 120
- - - - -
프로젝트 폴더 크기 : 988
- - - - -
2학기 폴더 크기 : 988
- - - - -
2학년 폴더 크기 : 1108
- - - - -
학교 폴더 크기 : 1364
- - - - -
*/
schoolFolder->Remove();
/*
입학사진 파일 삭제
1학년 폴더 삭제
- - - - -
강의계획서 파일 삭제
1학기 폴더 삭제
- - - - -
드래프트 파일 삭제
결과물 파일 삭제
프로젝트 폴더 삭제
- - - - -
2학기 폴더 삭제
- - - - -
2학년 폴더 삭제
- - - - -
학교 폴더 삭제
- - - - -
*/
return 0;
}