-
Notifications
You must be signed in to change notification settings - Fork 77
/
G28_Pimpl.cpp
102 lines (75 loc) · 2.21 KB
/
G28_Pimpl.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
/**************************************************************************************************
*
* \file G28_Pimpl.cpp
* \brief Guideline 28: Build Bridges to Remove Physical Dependencies
*
* Copyright (C) 2022 Klaus Iglberger - All Rights Reserved
*
* This file is part of the supplemental material for the O'Reilly book "C++ Software Design"
* (https://www.oreilly.com/library/view/c-software-design/9781098113155/).
*
**************************************************************************************************/
//---- <Person.h> ---------------------------------------------------------------------------------
#include <memory>
class Person
{
public:
// ...
Person();
~Person();
Person( Person const& other );
Person& operator=( Person const& other );
Person( Person&& other );
Person& operator=( Person&& other );
int year_of_birth() const;
// ... Many more access functions
private:
struct Impl;
std::unique_ptr<Impl> const pimpl_;
};
//---- <Person.cpp> -------------------------------------------------------------------------------
//#include <Person.h>
#include <string>
struct Person::Impl
{
std::string forename;
std::string surname;
std::string address;
std::string city;
std::string country;
std::string zip;
int year_of_birth;
// ... Potentially many more data members
};
Person::Person()
: pimpl_{ std::make_unique<Impl>() }
{}
Person::~Person() = default;
Person::Person( Person const& other )
: pimpl_{ std::make_unique<Impl>(*other.pimpl_) }
{}
Person& Person::operator=( Person const& other )
{
*pimpl_ = *other.pimpl_;
return *this;
}
Person::Person( Person&& other )
: pimpl_{ std::make_unique<Impl>(std::move(*other.pimpl_)) }
{}
Person& Person::operator=( Person&& other )
{
*pimpl_ = std::move(*other.pimpl_);
return *this;
}
int Person::year_of_birth() const
{
return pimpl_->year_of_birth;
}
// ... Many more Person member functions
//---- <Main.cpp> ---------------------------------------------------------------------------------
//#include <Person.h>
int main()
{
Person p1{};
return EXIT_SUCCESS;
}