Hands-On Design Patterns with C++
Solve common C++ problems with modern design patterns and build robust applications
Fedor G. Pikus
- 512 páginas
- English
- ePUB (apto para móviles)
- Disponible en iOS y Android
Hands-On Design Patterns with C++
Solve common C++ problems with modern design patterns and build robust applications
Fedor G. Pikus
Información del libro
A comprehensive guide with extensive coverage on concepts such as OOP, functional programming, generic programming, and STL along with the latest features of C++
Key Features
- Delve into the core patterns and components of C++ in order to master application design
- Learn tricks, techniques, and best practices to solve common design and architectural challenges
- Understand the limitation imposed by C++ and how to solve them using design patterns
Book Description
C++ is a general-purpose programming language designed with the goals of efficiency, performance, and flexibility in mind. Design patterns are commonly accepted solutions to well-recognized design problems. In essence, they are a library of reusable components, only for software architecture, and not for a concrete implementation.
The focus of this book is on the design patterns that naturally lend themselves to the needs of a C++ programmer, and on the patterns that uniquely benefit from the features of C++, in particular, the generic programming. Armed with the knowledge of these patterns, you will spend less time searching for a solution to a common problem and be familiar with the solutions developed from experience, as well as their advantages and drawbacks. The other use of design patterns is as a concise and an efficient way to communicate. A pattern is a familiar and instantly recognizable solution to specific problem; through its use, sometimes with a single line of code, we can convey a considerable amount of information. The code conveys: "This is the problem we are facing, these are additional considerations that are most important in our case; hence, the following well-known solution was chosen."
By the end of this book, you will have gained a comprehensive understanding of design patterns to create robust, reusable, and maintainable code.
What you will learn
- Recognize the most common design patterns used in C++
- Understand how to use C++ generic programming to solve common design problems
- Explore the most powerful C++ idioms, their strengths, and drawbacks
- Rediscover how to use popular C++ idioms with generic programming
- Understand the impact of design patterns on the program's performance
Who this book is for
This book is for experienced C++ developers and programmers who wish to learn about software design patterns and principles and apply them to create robust, reusable, and easily maintainable apps.
Preguntas frecuentes
Información
Policy-Based Design
- Strategy pattern and policy-based design
- Compile time policies in C++
- Implementations of policy-based classes
- Guidelines for the use of policies
Technical requirements
Strategy pattern and policy-based design
Foundations of policy-based design
template <typename T>
class SmartPtr {
public:
explicit SmartPtr(T* p = nullptr)
: p_(p) {}
~SmartPtr() {
delete p_;
}
T* operator->() { return p_; }
const T* operator->() const { return p_; }
T& operator*() { return *p_; }
const T& operator*() const { return *p_; }
private:
T* p_;
SmartPtr(const SmartPtr&) = delete;
SmartPtr& operator=(const SmartPtr&) = delete;
};
Class C { ..... };
{
SmartPtr<C> p(new C);
..... use p .....
} // Object *p is deleted automatically
template <typename T, typename DeletionPolicy>
class SmartPtr {
public:
explicit SmartPtr(
T* p = nullptr,
const DeletionPolicy& deletion_policy = DeletionPolicy()
) : p_(p),
deletion_policy_(deletion_policy)
{}
~SmartPtr() {
deletion_policy_(p_);
}
T* operator->() { return p_; }
const T* operator->() const { return p_; }
T& operator*() { return *p_; }
const T& operator*() const { return *p_; }
private:
T* p_;
DeletionPolicy deletion_policy_;
SmartPtr(const SmartPtr&) = delete;
SmartPtr& operator=(const SmartPtr&) = delete;
};
template <typename T>
struct DeleteByOperator {
void operator()(T* p) const {
delete p;
}
};
class C { ..... };
SmartPtr<C, DeleteByOperator<C>> p(new C);
template <typename T>
struct DeleteHeap {
explicit DeleteHeap(Heap& heap)
: heap_(heap) {}
void operator()(T* p) const {
p->~T();
heap_.deallocate(p);
}
private:
Heap& heap_;
};
template <typename T>
struct DeleteDestructorOnly {
void operator()(T* p) const {
p->~T();
}
};
typedef void (*delete_int_t)(int*);
void delete_int(int* p) { delete p; }
SmartPtr<int, delete_int_t> p(new int(42), delete_int);
template <typename T> void delete_T(T* p) { delete p; }
SmartPtr<int, delete_int_t> p(new int(42), delete_T<int>);
template <typename T, typename DeletionPolicy = DeleteByOperator<T>>
class SmartPtr {
.....
};
SmartPtr<C> p(new C);
explicit SmartPtr(
T* p = nullptr,
const DeletionPolicy& deletion_policy = DeletionPolicy());
template <typename T, typename DeletionPolicy = DeleteByOperator<T>>
class SmartPtr {
.....
private:
DeletionPolicy deletion_policy_;
};