100% found this document useful (5 votes)
51 views

3061Instant download Practical C++ Design: From Programming to Architecture Adam B. Singer pdf all chapter

The document provides information about the ebook 'Practical C++ Design: From Programming to Architecture' by Adam B. Singer, including links to download different editions and related digital products. It outlines the book's content, including chapters on software architecture, user interfaces, and design patterns in C++. Additionally, it mentions copyright details and the availability of supplementary materials on GitHub.

Uploaded by

rokustsihon
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (5 votes)
51 views

3061Instant download Practical C++ Design: From Programming to Architecture Adam B. Singer pdf all chapter

The document provides information about the ebook 'Practical C++ Design: From Programming to Architecture' by Adam B. Singer, including links to download different editions and related digital products. It outlines the book's content, including chapters on software architecture, user interfaces, and design patterns in C++. Additionally, it mentions copyright details and the availability of supplementary materials on GitHub.

Uploaded by

rokustsihon
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 50

Get the full ebook with Bonus Features for a Better Reading Experience on ebookmeta.

com

Practical C++ Design: From Programming to


Architecture Adam B. Singer

https://ebookmeta.com/product/practical-c-design-from-
programming-to-architecture-adam-b-singer/

OR CLICK HERE

DOWLOAD NOW

Download more ebook instantly today at https://ebookmeta.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Practical C++ Design: From Programming To Architecture 2nd


Edition Adam B. Singer

https://ebookmeta.com/product/practical-c-design-from-programming-to-
architecture-2nd-edition-adam-b-singer/

ebookmeta.com

Practical C++ Design: From Programming to Architecture 1st


Edition Adam B. Singer

https://ebookmeta.com/product/practical-c-design-from-programming-to-
architecture-1st-edition-adam-b-singer/

ebookmeta.com

Mnemonics for Radiologists and FRCR 2B Viva Preparation A


Systematic Approach Aug 15 2013 _ 1908911956 _ CRC Press
1st Edition Yoong
https://ebookmeta.com/product/mnemonics-for-radiologists-and-
frcr-2b-viva-preparation-a-systematic-approach-
aug-15-2013-_-1908911956-_-crc-press-1st-edition-yoong/
ebookmeta.com

The Dark Side of Social Media Psychological Managerial and


Societal Perspectives 1st Edition Pavica Sheldon

https://ebookmeta.com/product/the-dark-side-of-social-media-
psychological-managerial-and-societal-perspectives-1st-edition-pavica-
sheldon/
ebookmeta.com
Forensic Mental Health 2nd Edition Michele P. Bratina

https://ebookmeta.com/product/forensic-mental-health-2nd-edition-
michele-p-bratina/

ebookmeta.com

Minor Emergencies Philip M. Buttaravoli

https://ebookmeta.com/product/minor-emergencies-philip-m-buttaravoli/

ebookmeta.com

In the Wake of the Mongols The Making of a New Social


Order in North China 1200 1600 27th Edition Jinping Wang

https://ebookmeta.com/product/in-the-wake-of-the-mongols-the-making-
of-a-new-social-order-in-north-china-1200-1600-27th-edition-jinping-
wang/
ebookmeta.com

The Road Not Taken A Selection of Robert Frost s Poems


Frost

https://ebookmeta.com/product/the-road-not-taken-a-selection-of-
robert-frost-s-poems-frost/

ebookmeta.com

United States Anna Obiols

https://ebookmeta.com/product/united-states-anna-obiols/

ebookmeta.com
CompTIA A Complete Practice Tests Exam Core 1 220 1001 and
Exam Core 2 220 1002 2nd Edition Jeff T Parker Quentin
Docter
https://ebookmeta.com/product/comptia-a-complete-practice-tests-exam-
core-1-220-1001-and-exam-core-2-220-1002-2nd-edition-jeff-t-parker-
quentin-docter/
ebookmeta.com
Practical
C++ Design
From Programming to Architecture

Second Edition

Adam B. Singer
Practical C++ Design
From Programming to Architecture
Second Edition

Adam B. Singer
Practical C++ Design: From Programming to Architecture
Adam B. Singer
The Woodlands, TX, USA

ISBN-13 (pbk): 978-1-4842-7406-4 ISBN-13 (electronic): 978-1-4842-7407-1


https://doi.org/10.1007/978-1-4842-7407-1

Copyright © 2022 by Adam Singer


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not
identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the
material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Steve Anglin
Development Editor: Matthew Moodie
Coordinating Editor: Mark Powers
Cover designed by eStudioCalamar
Cover image by Jeremy Zero on Unsplash (www.unsplash.com)
Distributed to the book trade worldwide by Apress Media, LLC, 1 New York Plaza, New York, NY 10004,
U.S.A. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@springer-sbm.com, or visit www.
springeronline.com. Apress Media, LLC is a California LLC and the sole member (owner) is Springer Science +
Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a Delaware corporation.
For information on translations, please e-mail booktranslations@springernature.com; for reprint,
paperback, or audio rights, please e-mail bookpermissions@springernature.com.
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub via the book’s product page, located at www.apress.com/9781484274064. For more
detailed information, please visit http://www.apress.com/source-­code.
Printed on acid-free paper
For Terri, Caroline, and Rebecca.
Table of Contents
About the Author����������������������������������������������������������������������������������������������������� xi

About the Technical Reviewer������������������������������������������������������������������������������� xiii


Preface��������������������������������������������������������������������������������������������������������������������xv

Chapter 1: Defining the Case Study�������������������������������������������������������������������������� 1


1.1 A Brief Introduction����������������������������������������������������������������������������������������������������������������� 1
1.2 A Few Words About Requirements������������������������������������������������������������������������������������������ 2
1.3 Reverse Polish Notation (RPN)������������������������������������������������������������������������������������������������ 3
1.4 The Calculator’s Requirements����������������������������������������������������������������������������������������������� 5
1.5 The Source Code��������������������������������������������������������������������������������������������������������������������� 6

Chapter 2: Decomposition���������������������������������������������������������������������������������������� 9
2.1 The Elements of a Good Decomposition�������������������������������������������������������������������������������� 10
2.2 Selecting an Architecture������������������������������������������������������������������������������������������������������ 12
2.2.1 Multitiered Architecture������������������������������������������������������������������������������������������������ 13
2.2.2 Model-View-Controller (MVC) Architecture������������������������������������������������������������������� 14
2.2.3 Architectural Patterns Applied to the Calculator����������������������������������������������������������� 16
2.2.4 C
 hoosing the Calculator’s Architecture������������������������������������������������������������������������ 17
2.3 I nterfaces������������������������������������������������������������������������������������������������������������������������������ 17
2.3.1 C
 alculator Use Cases���������������������������������������������������������������������������������������������������� 18
2.3.2 A
 nalysis of Use Cases��������������������������������������������������������������������������������������������������� 21
2.3.3 A Quick Note on Actual Implementation����������������������������������������������������������������������� 28
2.4 Assessment of Our Current Design��������������������������������������������������������������������������������������� 29
2.5 Implementing Our Design Using C++20 Modules����������������������������������������������������������������� 29
2.5.1 W
 hy Modules?�������������������������������������������������������������������������������������������������������������� 29
2.5.2 U
 sing Legacy Headers�������������������������������������������������������������������������������������������������� 33

v
Table of Contents

2.5.3 Source Code Organization Prior to C++20������������������������������������������������������������������� 35


2.5.4 Source Code Organization Using C++20 Modules������������������������������������������������������� 38
2.5.5 Modules and pdCalc����������������������������������������������������������������������������������������������������� 43
2.6 Next Steps����������������������������������������������������������������������������������������������������������������������������� 47

Chapter 3: The Stack���������������������������������������������������������������������������������������������� 49


3.1 Decomposition of the Stack Module������������������������������������������������������������������������������������� 49
3.2 The Stack Class��������������������������������������������������������������������������������������������������������������������� 52
3.2.1 The Singleton Pattern��������������������������������������������������������������������������������������������������� 52
3.2.2 The Stack Module As a Singleton Class������������������������������������������������������������������������ 54
3.3 A
 dding Events����������������������������������������������������������������������������������������������������������������������� 56
3.3.1 T he Observer Pattern���������������������������������������������������������������������������������������������������� 57
3.3.2 The Stack As an Event Publisher���������������������������������������������������������������������������������� 75
3.3.3 The Complete Stack Module Interface�������������������������������������������������������������������������� 76
3.4 A
 Quick Note on Testing�������������������������������������������������������������������������������������������������������� 77

Chapter 4: The Command Dispatcher��������������������������������������������������������������������� 79


4.1 Decomposition of the Command Dispatcher������������������������������������������������������������������������� 79
4.2 The Command Class������������������������������������������������������������������������������������������������������������� 80
4.2.1 The Command Pattern�������������������������������������������������������������������������������������������������� 80
4.2.2 More on Implementing Undo/Redo������������������������������������������������������������������������������� 81
4.2.3 The Command Pattern Applied to the Calculator���������������������������������������������������������� 83
4.3 T he Command Factory�������������������������������������������������������������������������������������������������������� 103
4.3.1 T he CommandFactory Class��������������������������������������������������������������������������������������� 103
4.3.2 R
 egistering Core Commands�������������������������������������������������������������������������������������� 111
4.4 T he Command Manager������������������������������������������������������������������������������������������������������ 112
4.4.1 T he Interface��������������������������������������������������������������������������������������������������������������� 112
4.4.2 Implementing Undo and Redo������������������������������������������������������������������������������������ 113
4.5 T he Command Interpreter��������������������������������������������������������������������������������������������������� 115
4.5.1 T he Interface��������������������������������������������������������������������������������������������������������������� 116
4.5.2 I mplementation Details���������������������������������������������������������������������������������������������� 123
4.6 R
 evisiting Earlier Decisions������������������������������������������������������������������������������������������������ 127

vi
Table of Contents

Chapter 5: The Command Line Interface�������������������������������������������������������������� 129


5.1 The User Interface Abstraction�������������������������������������������������������������������������������������������� 129
5.1.1 The Abstract Interface������������������������������������������������������������������������������������������������ 130
5.1.2 User Interface Events������������������������������������������������������������������������������������������������� 133
5.2 The Concrete CLI Class������������������������������������������������������������������������������������������������������� 137
5.2.1 Requirements������������������������������������������������������������������������������������������������������������� 137
5.2.2 The CLI Design������������������������������������������������������������������������������������������������������������ 139
5.3 Tying It Together: A Working Program��������������������������������������������������������������������������������� 153

Chapter 6: The Graphical User Interface��������������������������������������������������������������� 155


6.1 Requirements���������������������������������������������������������������������������������������������������������������������� 155
6.2 Building GUIs����������������������������������������������������������������������������������������������������������������������� 159
6.2.1 Building GUIs in IDEs�������������������������������������������������������������������������������������������������� 159
6.2.2 Building GUIs in Code������������������������������������������������������������������������������������������������� 160
6.2.3 Which GUI Building Method Is Better?������������������������������������������������������������������������ 161
6.3 Modularization�������������������������������������������������������������������������������������������������������������������� 162
6.3.1 T he CommandButton Abstraction������������������������������������������������������������������������������� 163
6.3.2 G
 etting Input��������������������������������������������������������������������������������������������������������������� 169
6.3.3 T he Display����������������������������������������������������������������������������������������������������������������� 172
6.3.4 T he Model������������������������������������������������������������������������������������������������������������������� 176
6.3.5 T he Display Redux������������������������������������������������������������������������������������������������������ 178
6.3.6 Tying It Together: The Main Window��������������������������������������������������������������������������� 179
6.3.7 L ook-and-Feel������������������������������������������������������������������������������������������������������������ 181
6.4 A
 Working Program������������������������������������������������������������������������������������������������������������� 182
6.5 A
 Microsoft Windows Build Note����������������������������������������������������������������������������������������� 183

Chapter 7: Plugins������������������������������������������������������������������������������������������������ 185


7.1 What Is a Plugin?���������������������������������������������������������������������������������������������������������������� 185
7.1.1 Rules For C++ Plugins����������������������������������������������������������������������������������������������� 186
7.2 Problem 1: The Plugin Interface������������������������������������������������������������������������������������������ 189
7.2.1 The Interface for Discovering Commands������������������������������������������������������������������ 189
7.2.2 The Interface for Adding New GUI Buttons����������������������������������������������������������������� 195

vii
Table of Contents

7.2.3 Plugin Allocation and Deallocation����������������������������������������������������������������������������� 196


7.2.4 The Plugin Command Interface���������������������������������������������������������������������������������� 197
7.2.5 API Versioning������������������������������������������������������������������������������������������������������������� 200
7.2.6 Making the Stack Available���������������������������������������������������������������������������������������� 201
7.3 Problem 2: Loading Plugins������������������������������������������������������������������������������������������������ 203
7.3.1Platform-Specific Plugin Loading�������������������������������������������������������������������������������� 203
7.3.2 Loading, Using, and Closing a Shared Library������������������������������������������������������������ 203
7.3.3 A Design for Multiplatform Code�������������������������������������������������������������������������������� 206
7.4 Problem 3: Retrofitting pdCalc�������������������������������������������������������������������������������������������� 218
7.4.1 I njecting Commands��������������������������������������������������������������������������������������������������� 218
7.4.2 Adding Plugin Buttons to the GUI�������������������������������������������������������������������������������� 219
7.5 I ncorporating Plugins���������������������������������������������������������������������������������������������������������� 220
7.5.1 L oading Plugins���������������������������������������������������������������������������������������������������������� 220
7.5.2 I njecting Functionality������������������������������������������������������������������������������������������������ 222
7.6 A
 Concrete Plugin���������������������������������������������������������������������������������������������������������������� 224
7.6.1 P lugin Interface���������������������������������������������������������������������������������������������������������� 224
7.6.2 Source Code Dependency Inversion��������������������������������������������������������������������������� 226
7.6.3 I mplementing HyperbolicLnPlugin’s Functionality������������������������������������������������������ 227
7.7 N
 ext Steps��������������������������������������������������������������������������������������������������������������������������� 230

Chapter 8: New Requirements������������������������������������������������������������������������������ 231


8.1 Fully Designed New Features��������������������������������������������������������������������������������������������� 231
8.1.1 Batch Operation���������������������������������������������������������������������������������������������������������� 232
8.1.2 Stored Procedures������������������������������������������������������������������������������������������������������ 233
8.2 Designs Toward a More Useful Calculator��������������������������������������������������������������������������� 249
8.2.1 Complex Numbers������������������������������������������������������������������������������������������������������ 250
8.2.2 Variables��������������������������������������������������������������������������������������������������������������������� 254
8.3 Some Interesting Extensions for Self-Exploration��������������������������������������������������������������� 259
8.3.1 H
 igh DPI Scaling��������������������������������������������������������������������������������������������������������� 259
8.3.2 D
 ynamic Skinning������������������������������������������������������������������������������������������������������� 259
8.3.3 F low Control��������������������������������������������������������������������������������������������������������������� 260
8.3.4 A
 n Alternative GUI Layout������������������������������������������������������������������������������������������� 260
8.3.5 A
 Graphing Calculator������������������������������������������������������������������������������������������������� 260

viii
Table of Contents

8.3.6 A Plugin Management System������������������������������������������������������������������������������������ 261


8.3.7 A Mobile Device Interface������������������������������������������������������������������������������������������� 261
8.3.8 pdCalc in the Cloud���������������������������������������������������������������������������������������������������� 261

Appendix A: Acquiring, Building, and Executing pdCalc��������������������������������������� 263


A.1 Getting the Source Code����������������������������������������������������������������������������������������������������� 263
A.2 Dependencies��������������������������������������������������������������������������������������������������������������������� 264
A.3 Building pdCalc������������������������������������������������������������������������������������������������������������������� 265
A.3.1 Using Qt Creator��������������������������������������������������������������������������������������������������������� 266
A.3.2 Using the Command Line������������������������������������������������������������������������������������������� 267
A.4 Executing pdCalc���������������������������������������������������������������������������������������������������������������� 269
A.4.1 Using Qt Creator��������������������������������������������������������������������������������������������������������� 269
A.4.2 Using the Command Line������������������������������������������������������������������������������������������� 269
A.5 Troubleshooting������������������������������������������������������������������������������������������������������������������ 270

Appendix B: Organization of the Source Code������������������������������������������������������ 271


B.1 The src Directory����������������������������������������������������������������������������������������������������������������� 271
B.1.1 The 3rdParty Directory����������������������������������������������������������������������������������������������� 272
B.1.2 The app/pdCalc Directory������������������������������������������������������������������������������������������� 272
B.1.3 The app/pdCalc-simple-cli Directory�������������������������������������������������������������������������� 272
B.1.4 The app/pdCalc-simple-gui Directory������������������������������������������������������������������������ 272
B.1.5 The utilities Directory������������������������������������������������������������������������������������������������� 272
B.1.6 The backend Directory����������������������������������������������������������������������������������������������� 273
B.1.7 The ui Directory���������������������������������������������������������������������������������������������������������� 274
B.1.8 The plugins Directory������������������������������������������������������������������������������������������������� 275
B.2 The test Directory���������������������������������������������������������������������������������������������������������������� 275
B.2.1 The testDriver Directory��������������������������������������������������������������������������������������������� 276
B.2.2 The utilitiesTest Directory������������������������������������������������������������������������������������������� 276
B.2.3 The backendTest Directory����������������������������������������������������������������������������������������� 276
B.2.4 The uiTest Directory���������������������������������������������������������������������������������������������������� 277
B.2.5 The pluginsTest Directory������������������������������������������������������������������������������������������� 277

References������������������������������������������������������������������������������������������������������������ 279

Index��������������������������������������������������������������������������������������������������������������������� 283

ix
About the Author
Adam B. Singer graduated first in his class at the Georgia Institute of Technology in
1999 with a bachelor’s degree in chemical engineering. He subsequently attended
the Massachusetts Institute of Technology (MIT) on a National Defense Science and
Engineering Graduate Fellowship. He graduated from MIT with a Ph.D. in chemical
engineering in 2004 after defending his thesis titled “Global Dynamic Optimization.”
Since graduation, Adam has been employed by ExxonMobil1 in various Upstream
organizations, including research, information technology, and digital transformation.
He has held both technical and managerial roles in software development, design, and
project management in areas such as mathematical optimization, reservoir modeling
and simulation, decision support under uncertainty, basin modeling, well log modeling,
process stratigraphy, geoscience platform architecture, and data science. He has also
served on and chaired committees designing in-house training in the areas of technical
software development and computational and applied mathematics. He is currently the
Senior Principal Digital Architect for ExxonMobil.
Adam additionally held the title of adjunct assistant professor in the Department of
Computational and Applied Mathematics at Rice University from 2007 to 2012. In 2006
and 2007, he taught a graduate-level course, CAAM 520, on computational science.
The course focused on the design and implementation of high-performance parallel
programs.

1
 The advice, information, and conclusions discussed in this book are those of the author and
have not been endorsed by, or reflect the opinions or practices of, ExxonMobil Corporation or its
affiliates.

xi
About the Technical Reviewer
German Gonzalez-Morris is a software architect/engineer working with C/C++,
Java, and different application containers, in particular with WebLogic Server.
He has developed various applications using JEE, Spring, and Python. His areas
of expertise also include OOP, Java/JEE, Python, design patterns, algorithms, Spring
Core/MVC/security, and microservices. German has worked with performance
messaging, RESTful API, and transactional systems. For more information about him,
visit ­www.linkedin.com/in/german-­gonzalez-­morris.

xiii
Preface
Motivation of the Author
Throughout my career, I have mentored both students and fellow employees in
programming, and many of them have suggested that I write my thoughts down in book
form. However, I have typically responded with the rebuttal that I felt I had nothing novel
to present. Being a largely self-taught programmer, I have always been able to rattle off
a long list of books from which I have derived most of my knowledge. Therefore, what
could I write about that has not already been said?
I came to realize, however, that the majority of books that I had encountered
tended to focus only on pieces of design or implementation rather than taking a holistic
approach. For example, if one wants to learn the C++ language, Stroustrup [30] or
Lippman and Lajoie [19] are excellent references. For learning C++ best practices, one
need only read the books by Sutter [31, 32, 33], Sutter and Alexandrescu [34], or Meyers
[22, 21, 23]. Of course, learning to program extends well beyond C++. For data structures
and algorithms, there are always the classics by Knuth [15, 16, 17] or the more accessible
and concise book by Cormen et al. [10]. To learn object-oriented analysis and design,
the book by Booch et al. [8] is an excellent reference. Of course, design patterns can be
learned from Gamma et al. [11], and general programming practices can be learned from
many books such as those by McConnell [20], Spinellis [29], or Kernighan and Pike [14].
Certainly, the deeper the specialty one seeks, the more esoteric the book one can
find (and should eventually read). This book is not such a book. Rather, I have striven to
write a book that operates from the premise that the reader already possesses a working
knowledge of the information encased in works such as the aforementioned titles. In this
book, I instead attempt to ground the reader’s theoretical knowledge of design through
practice using a single case study.

xv
Preface

Target Audience
As mentioned previously, the goal of this book is not to present any specific topic
but rather to explore the interrelationship of often compartmentalized subjects. The
successful combination of these components to form a cohesive, maintainable, elegant
piece of software is, in essence, design. As such, this book is intended to target practicing
professionals, in particular those who have several years of development experience but
who do not yet possess sufficient experience to architect independently a large software
project.
Because my intent is to emphasize utilization of one’s existing knowledge effectively
to design software, I make little effort to explain individual topics in great depth. I believe
too many books classified as intermediate to advanced fail because the author devotes
too much content describing prerequisites. The result is a massive tome filled with
unnecessary detail for the advanced reader, while the beginner is left with a long and
complicated exposition that is still inaccessible because the beginner does not possess
sufficient knowledge or experience to grasp the subject regardless of the amount of detail
devoted to the description. I have, therefore, aimed for conciseness over completeness.
Often, I simply refer the reader to relevant material rather than myself describe a
background topic in great detail. While this strategy may indeed make this book difficult
for beginners, I hope experienced professionals appreciate both the brevity of the book
and its tone, which assumes the reader is competent at their craft.

Structure of the Book


Learning most tasks in programming requires hands-on experience and repetition;
design is no exception. My opinion is that design is best learned through a combination
of self-exploration and mentoring from an expert. For this reason, I have chosen to
organize this book as a study in design through the detailed working of a case study.
Instead of discussing design elements in the abstract, we will instead examine the
concrete application of design principles as they relate to the design and construction
of a simplistic (but not too simplistic) software project. Importantly, we will not only
examine successful results that led to the final implementation, but we will also spend
time considering alternatives, some of which are viable and others which are not. Where
multiple solutions may suffice, choosing one over the other is often either a matter of
context or just taste. Regardless, experience is usually the arbiter of such decisions, and

xvi
Preface

hopefully this book will enable the reader to learn from the author’s experiences without
having to repeat his mistakes. That is, I hope I have created a book that can serve as a
self-contained master class in design.

The Case Study


To this point, I have not yet mentioned the subject of the case study central to this
book. In my opinion, an ideal problem would be one that is not too daunting and yet
not so trivial that it needs no design. Additionally, the domain of the problem should
be readily understandable to any reader. For this reason, I have chosen to implement a
stack-based, Reverse Polish Notation (RPN) calculator that I named pdCalc, short for
practical design calculator. Functionally, pdCalc was inspired by the HP48S calculator,
an old favorite calculator of mine from high school and college (which still sits on my
desk today). I cannot imagine any reader being unfamiliar with the basic operations of
a calculator, and making the calculator use RPN adds a little twist that I hope will make
the project interesting. If your sole objective were to code a simple calculator with basic
functionality, admittedly, the design of pdCalc is overkill, and more code is written from
scratch than is strictly necessary. Remember, pdCalc’s primary purpose is to serve as an
instructional tool – a reduced-size representation of a real project. That pdCalc happens
to be a functioning RPN calculator is a secondary objective.

Language Selection
Design as an abstract concept can be taught in the absence of a particular programming
language. However, once committed to a concrete example, a specific language must
be chosen for the implementation. I decided to write the case study exclusively using
C++. While every line of the program does not appear in the text, all of the source code
is available for the reader to examine. Despite this book’s primary focus on design,
reading the source code is a good way to learn how implementation details in a specific
language enable or, at least, facilitate a chosen design. The source code also serves as
a high-quality (I hope) exemplar of a modern C++ implementation of a complete user
application. I highly recommend reading and modifying the source code in conjunction
with reading the text.
The decision to use C++ does not imply that C++ is the best choice for all programs,
and, in fact, it may not even be the best choice for the program examined in this book.
However, to ground the abstraction, a concrete language had to be selected. I chose
xvii
Preface

C++ because it is standardized, widely deployed, and available at zero cost on many
platforms. Selfishly, I also chose C++ because it is my most proficient language. While I
could, perhaps, have chosen another language meeting the aforementioned objective
criteria (e.g., Python), the resulting code would probably have been functional but
nonidiomatic due to my relative lack of expertise.
During the writing of the first edition of this book, C++0x was ratified as C++11
and then updated as C++14. C++11, with smart pointers, move semantics, lambdas,
variadic templates, and a host of other new features, fundamentally changed how
one could express a design in the C++ language. My objective at the time was to avoid
incorporating modern C++ features where they were inappropriate just to demonstrate
usage. Instead, I sought to highlight how these new language elements could be used
effectively in the design of a large-scale program. Hopefully, I achieved my objective.
Design and architecture have not changed significantly since the publication of
the first edition of this book, so why write a second edition? If this were an abstract
design book, such an update would be unnecessary. However, since the publication
of the first edition, C++17 and C++20 were both ratified. Because the book’s case study
is accompanied by a complete implementation, expressing a concrete design using
C++ has evolved with new language developments. While C++17 added several new
implementation features, none of these features substantially impacted the ability to
express designs in the language. C++20, on the other hand, is different.
C++20, maybe even more so than C++11, fundamentally changes how designs may
be expressed in C++. In particular, four new major language features were added: ranges,
coroutines, concepts, and modules, all of which make, at least, a brief appearance in
the case study. The ranges library does not fundamentally alter program design. It does,
however, fundamentally change the way algorithms can be implemented, especially
with the better integration of the functional programming paradigm as enabled through
views. Coroutines add cooperative multitasking to the C++ language. We will see that
even in a single-threaded program such as the one described in this book, coroutines
can be used to express an idea from the first edition differently. Concepts change the
way generic programs are constructed. This book’s design does not make extensive
use of templates; therefore, concepts make only the briefest of appearances. Lastly,
C++20 finally brings modularization to C++ as a formal language construct. This change
drastically impacts how code can be organized, including, in many instances, completely
eliminating the need for header files. We will explore the usage of C++ modules, and
their interaction with dynamically linked libraries, in some depth.

xviii
Another Random Document on
Scribd Without Any Related Topics
»Kuten näette, madame, teen vaaran uhatessa kaikkeni
torjuakseni sen hänestä.»

»Onko teidän majesteettinne valmis lähtemään?» kysyi


sveitsiläiskapteeni, joka oli saanut tehtäväkseen suojella kuningasta,
kun tämä menisi puutarhan kautta.

»Olen», vastasi kuningas ja painoi Charnyn hatun päähänsä.

»Lähtekäämme siis», kehoitti kapteeni.

Kuningas lähti kahden sveitsiläisrivin välissä. Sotilaat astelivat


samaa jalkaa kuin hän.

Äkkiä kuului oikealta kovaa meteliä. Tuileriein puolinen portti, se,


joka oli Flora-kahvilan vieressä, oli murrettu. Kansanjoukko, joka tiesi
kuninkaan olevan matkalla kansalliskokoukseen, syöksyi puutarhaan.

Mies, joka näytti johtavan tätä laumaa, kantoi lippuna piikin


kärkeen pantua päätä.

Kapteeni komensi pysähtymään ja kiväärit valmiiksi.

»Herra de Charny», sanoi kuningatar, »jos huomaatte minun


joutuvan noiden roistojen käsiin, niin surmaattehan minut, eikö
niin?»

»En voi luvata sitä, madame», vastasi Charny.

»Miksette?» huudahti kuningatar.

»Koska olen kuollut, ennenkuin kenenkään käsi pääsee kajoamaan


teihin.»
»Kas,» sanoi kuningas, »tuohan on poloisen Mandatin pää.
Tunnen sen.»

Murhaajalauma ei uskaltanut lähestyä, mutta se syyti herjasanoja


kuninkaalle ja kuningattarelle. Viisi kuusi pyssyä laukaistiin. Yksi
sveitsiläinen kaatui kuolleena maahan, muuan toinen haavoittui.

Kapteeni komensi kiväärin poskelle. Miehet tottelivat.

»Älkää ampuko», neuvoi Charny, »sillä silloin ei ainoakaan meistä


pääse elävänä kansalliskokoukseeni.»

»Se on totta, hyvä herra», myönsi kapteeni. »Kivääri olalle vie!»

Miehet panivat kiväärin olalle ja sitten jatkettiin matkaa viistosti


puutarhan läpi.

Kesän helle oli paahtanut kastanjoiden lehdet keltaisiksi. Vaikka


elokuu oli vasta alkupuolellaan, näkyi maassa jo kosolta varisseita
lehtiä.

Pikku kruununprinssi tallasi niitä jaloillaan ja työnsi niitä huvikseen


siskonsa eteen.

»Lehdet varisevat varhain tänä vuonna», huomautti kuningas.

»Eikö joku noista miehistä ole kirjoittanut: 'Kuninkuus kestää vain


lehtisatoon saakka'?» kysyi kuningatar.

»On kyllä, madame», vastasi Charny. »Mikä on sen tarkan


ennustajan nimi?»

»Manuel.»
Sitten ilmestyi uusi este kuninkaallisen perheen tielle. Melkoinen
joukko miehiä ja naisia seisoi uhkaavin elein ja aseita heilutellen
portailla ja pengermällä, joiden kautta oli kuljettava Tuileriein
puutarhasta Maneesiin.

Vaara koitui sitäkin uhkaavammaksi, kun sveitsiläiset eivät voineet


enää pitää rivejään koossa. Siitä huolimatta kapteeni yritti tunkeutua
lauman läpi, mutta ahdistelijat raivostuivat siitä niin silmittömästi,
että Röderer huusi:

»Varokaa, herra! Sillä teolla te surmautatte kuninkaan!»

Pysähdyttiin. Kansalliskokoukseen lähetettiin muuan henkilö


ilmoittamaan, että kuningas oli tulossa pyytämään siltä suojaa.

Kansalliskokous valitsi lähetystön. Mutta kun tämä tuli näkyviin,


yltyi kansan raivo entistä kiihkeämmäksi. Kuului hurjia huutoja:

»Alas Veto, alas Itävallatar! Ero tai kuolema!»

Molemmat lapset, jotka ymmärsivät, että heidän äitiään varsinkin


uhattiin, painautuivat häneen kiinni. Pikku kruununprinssi kysyi:

»Herra de Charny, miksi nuo ihmiset haluavat surmata äidin?»

Muuan jättiläisen kokoinen piikkimies, joka huusi muita


äänekkäämmin: »Alas Veto, kuolema Itävallattarelle!» koetti
piikillään sohien tavoittaa milloin kuningatarta, milloin kuningasta.

Sveitsiläissaattue oli vähitellen tungettu syrjään, ja kuninkaallista


perhettä suojasivat enää vain ne kuusi aatelismiestä, jotka olivat
lähteneet sen mukana Tuilerieista, Charny ja kansalliskokouksen
lähetystö, joka oli tullut sitä noutamaan.
Jäljellä oli vielä kolmenkymmenen askelen taival tiheäksi
sulloutuneen väkijoukon halki. Oli ilmeistä, että tavoiteltiin kuninkaan
ja etenkin kuningattaren henkeä.

Taistelu alkoi portaitten juurella.

»Hyvä herra», sanoi Röderer Charnylle, »pankaa miekka tuppeen


tai minä en vastaa mistään».

Charny totteli sanaakaan lausumatta.

Kuninkaan seurue liikkui joukon mukana kuten myrskyn riehuessa


vene kiikkuu laineilla. Virta vyöryi sentään yhä kansalliskokoukseen
päin. Kuninkaan itsensä täytyi kerran työntää syrjään mies, joka
heristi nyrkkiään hänen kasvojensa edessä. Pikku kruununprinssi oli
tukehtumaisillaan; hän vaikeroi ja kohotti käsiään kuin apua
huutaakseen.

Muuan mies syöksyi esille ja riuhtaisi lapsen hänen äitinsä sylistä.

»Herra de Charny», huusi kuningatar. »Jumalan tähden,


pelastakaa poikani!»

Charny kääntyi tavoittamaan miestä, joka vei lasta, mutta tuskin


hän oli astunut pari askelta, kun pari kolme käsivartta ojentui
tavoittamaan kuningatarta ja muuan käsi tarttui kaulahuiviin, joka
peitti hänen rintaansa. Silloin kuningatar taas parahti.

Charny unohti Rödererin varoituksen, ja hänen miekkansa upposi


pontta myöten mieheen, joka oli tohtinut kajota kuningattareen.

Joukko ulisi raivosta nähdessään yhden heikäläisistään kaatuvan ja


ahdisti yhä hurjemmin kuninkaan saattuetta. Naiset kirkuivat:
»Tappakaa Itävallatar! Luovuttakaa hänet meille, kyllä me hänet
nitistämme! Kuolemaan, kuolemaan!»

Ja parikymmentä käsivartta kurkottui tarttumaan häneen. Mutta


tuskasta suunniltaan kuningatar ei välittänyt itsestään, vaan huusi
yhtenään:

»Poikani, poikani!»

Oltiin jo miltei kansalliskokouksen istuntosalin kynnyksellä.


Väkijoukko teki viimeisen ponnistuksen, sillä se tajusi, että saalis oli
luisumaisillaan sen käsistä.

Charny oli niin kovassa puserruksessa, ettei voinut käyttää muuta


kuin miekkansa pontta. Hän näki nyrkkiin puristettujen ja uhkaavien
käsien joukossa pistoolin, joka oli suunnattu kuningattareen. Silloin
hän päästi miekkansa, tarttui molemmin käsin pistooliin, riuhtaisi sen
pois miehen kädestä ja laukaisi lähinnä seisovan ahdistajan rintaan.
Mies kaatui.

Charny kumartui ottamaan miekkansa, mutta se oli jo toisen


miehen kädessä, joka sillä tähtäsi iskua kuningattareen. Charny
syöksyi miehen kimppuun.

Juuri sillä hetkellä kuningatar astui kuninkaan jäljessä


kansalliskokouksen eteiseen. He olivat pelastuneet!

Valitettavasti sulkeutui ovi heidän jälkeensä, ja sen kynnyksen


eteen Charny suistui saatuaan päähänsä rautakangen iskun ja piikin
lävistettyä hänen rintansa.

»Kuten molemmat veljeni!» mutisi hän kaatuessaan. »Poloinen


Andrée…!»
Näin täyttyi Charnyn kohtalo, kuten oli täyttynyt Isidorin ja
Georgesin. — Kuningattaren kohtalo täyttyisi aikanaan.

Juuri sillä hetkellä kuului hirveää ammuntaa, joka ilmaisi, että


hyökkääjät ja palatsin varusväki olivat joutuneet otteluun keskenään.
XXXII

Kello kahdestatoista kolmeen

Kun kapinallisten kärkijoukko oli torjuttu, luulivat sveitsiläiset,


kuten kuningatarkin, että oli taisteltu itse pääarmeijan kanssa ja että
se armeija oli nyt hajoitettu. He olivat surmanneet arviolta neljäsataa
miestä Royale-pihalla, sataviisikymmentä tai kaksisataa Carrousel-
aukiolla ja vallanneet seitsemän tykkiä. Niin pitkältä kuin voi nähdä,
ei näkynyt ainoatakaan puolustuskuntoista miestä.

Vain pieni erillinen patteri, joka oli sijoitettu sveitsiläisten päävahtia


vastapäätä olevan talon pengermälle, jatkoi yhä ammuskelua, eikä
sen tulta kyetty vaientamaan.

Nyt luultiin siis, että oli päästy kapinasta voitolle, ja päätettiin millä
hinnalla tahansa vallata myöskin tuo pikku patteri, mutta silloin
kuului laiturikadun taholta rummunpärinää ja raskaan tykistön
kovaäänistä kolinaa. Sitä armeijaa kuningas oli katsellut kaukolasilla
Louvren kokoelmasalin ikkunasta..

Siihen aikaan alkoi levitä huhu, että kuningas oli lähtenyt


palatsista hakeakseen turvaa kansalliskokouksesta. Vaikeata on
kuvata, minkälaisen vaikutuksen tämä uutinen teki, kaikkein
innokkaimpiin rojalisteihinkin. Kuningas, joka oli luvannut kuolla
kuninkaallisella asemallaan, jätti paikkansa ja siirtyi vihollisen
puolelle tai ainakin antautui vangiksi taistelematta.

Heti katsoivat kansalliskaartilaiset olevansa vapaat valastaan ja


poistuivat melkein kaikki. Jotkut aatelismiehet seurasivat heitä, sillä
he pitivät tarpeettomana kaatua asian puolesta, joka itse tunnusti
hävinneensä. Vain sveitsiläiset jäivät, synkkinä, äänettöminä, kurin
orjina.

Flora-paviljongin pengermältä ja Louvren kokoelmasalin ikkunoista


nähtiin ne sankarilliset esikaupunkilaiset, joita mikään armeija ei ole
milloinkaan voittanut ja jotka yhdessä päivässä hajoittivat maan
tasalle Bastiljin, vaikka sen perustukset olivat juuttuneet maahan
neljän vuosisadan kuluessa.

Hyökkääjillä oli oma suunnitelmansa. He luulivat kuninkaan olevan


yhä palatsissa ja aikoivat saartaa sen kaikilta tahoilta ottaakseen
kuninkaan vangiksi. Sen armeijaosaston, joka marssi vasenta
jokirantaa, tuli ohjeitten mukaan tunkeutua rannanpuolisesta
ristikkoportista; Saint-Honoré-kadulta etenevän osaston tuli
murtautua Feuillants-portista, ja kolmannen, oikeaa jokirantaa
kulkevan osaston, jota komensi Westermann, Santerre ja Billot
käskyläisinään, oli hyökättävä palatsiin julkisivun puolelta.

Viimeksimainittu osasto vyöryi Carrousel-aukiolle laulaen Käy


päinsä. Marseillelaiset marssivat joukon etupäässä kuljettaen
keskessään kahta raehauleilla panostettua pientä tykkiä.

Noin kaksisataa sveitsiläistä seisoi taisteluvalmiina


Carrousel-aukiolla.
Kapinalliset marssivat suoraan heitä kohden ja kun sveitsiläiset
laskivat kiväärinsä tähtäysasentoon, paljastivat he molemmat
tykkinsä ja laukaisivat.

Sotilaat ampuivat niinikään yhteislaukauksen, mutta vetäytyivät


heti takaisin palatsin suojaan ja jättivät kolmisenkymmentä vainajaa
ja haavoittunutta Carrouselin kiville.

Hyökkääjät, Marseillen ja Bretagnen liittolaiset etunenässä,


syöksyivät heti Tuilerieihin ja valtasivat kaksi pihaa — Royale-pihan,
joka oli vainajien peitossa, ja Prinssien pihan, joka oli lähinnä Flora-
paviljonkia ja laiturikatua.

Billot halusi taistella siellä, missä Pitou oli kaatunut. Hän toivoi
sentään, että Pitou oli vain haavoittunut, joten hän saisi tehdä
Pitoulle Royale-pihalla saman palveluksen, jonka Pitou oli tehnyt
hänelle Mars-kentällä. Hän astui siis ensimmäisten mukana
keskipihaan. Veren lemu oli niin kirpeä, että olisi luullut tulleensa
teurastamoon, ja sitä huokui ruumiskasoista melkein savunkaltaisena
huuruna.

Tämä näky ja tämä löyhkä kiihoittivat hyökkääjiä. He syöksyivät


hurjasti huutaen palatsia vastaan. Ja vaikka he olisivat tahtoneetkin,
eivät he olisi voineet peräytyä. Joukko, joka tunkeutui Carrousel-
ristikkoportista — se oli siihen aikaan melkoista ahtaampi kuin
nykyisin — työnsi ensimmäisiä eteenpäin.

Mutta ehättäkäämme sanomaan, että vaikka palatsi olisi palanut


yhtenä tulimerenä, ei kukaan olisi ajatellutkaan peräytymistä.

Keskipihalle päästyään hyökkääjät, kuten nekin, joiden veressä he


kahlasivat polviaan myöten, joutuivat kahden tulen väliin:
pääeteisestä ja kasarmeista suunnattuun ristituleen.

Ensin piti tukehduttaa jälkimmäisten kiväärituli.

Marseillelaiset hyökkäsivät niitä vastaan kuin koirat lihapadan


kimppuun, mutta he eivät voineet repiä niitä paljain käsin. He
pyysivät rautakankia, kuokkia ja lapioita. Billot pyysi tykinammuksia.

Westermann käsitti luutnanttinsa suunnitelman, ja paikalle tuotiin


tykinammuksia, joihin oli kiinnitetty sytytyslanka.

Silläkin uhalla, että ruuti syttyisi heidän käsissään, marseillelaiset


virittivät sytytyslangat palamaan ja viskasivat ammukset
kasarmeihin.

Kasarmit hulmahtivat pian liekkeihin, ja niiden puolustajien täytyi


poistua paikaltaan ja paeta palatsin eteiseen.

Siellä iski teräs teräkseen, tuli vastasi tuleen.

Äkkiä Billot tunsi, että joku syleili häntä takaapäin. Hän kääntyi
rutosti, arvellen joutuneensa vihollisen ahdistettavaksi, mutta
nähdessään syleilijän hän huudahti ilosta.

Se oli Pitou! Pitou, melkein tuntemattomana, yltyleensä veressä,


mutta elävänä, terveenä ja haavoittumattomana.

Kuten mainitsimme, Pitou oli nähdessään sveitsiläisten laskevan


kiväärin poskelleen, huutanut: »Maahan!» ja itse näyttänyt
esimerkkiä. Mutta hänen toverinsa eivät olleet ehtineet sitä
noudattaa. Suunnattoman viikatteen lailla oli yhteislaukaus niittänyt
kolme neljännestä siitä ihmisviljasta, joka vaatii viisikolmatta vuotta
tuleentuakseen ja vain yhden sekunnin kaatuakseen.
Pitou oli tuntenut suorastaan hautautuneensa ruumiitten alle ja
kylpevänsä jossakin lämpöisessä nesteessä, jota virtasi kaikilta
suunnilta. Vaikka hänen asemansa olikin hirveän epämiellyttävä —
tukehtumaisillaan kun hän oli ruumiitten puristuksesta ja hyytyvään
vereen — päätti hän pysyä ääntä päästämättä paikallaan ja odottaa
suotuisaa hetkeä, ennenkuin antaisi itsestään elonmerkin. Mutta tätä
suotuisaa hetkeä hän oli saanut odottaa kokonaisen tunnin, jonka
jokainen minuutti oli tuntunut hänestä tunnin pituiselta.

Kun hän sitten kuuli toveriensa voitonhuudot ja Billotin äänen,


joka kutsui häntä, arveli hän otollisen hetken lyöneen.

Etnan syvyyksiin haudatun Enkeladoksen lailla hän oli silloin


ravistanut päällänsä ruumispeitteen, päässyt lopulta pystyyn ja
huomattuaan Billotin joukon ensimmäisessä rivissä rientänyt ukkoa
syleilemään, piittaamatta ollenkaan, miltä puolelta se tapahtui.

Sveitsiläisten yhteislaukaus, joka kaatoi maahan toistakymmentä


miestä, muistutti Billotille ja Pitoulle tilanteen vakavuutta.

Yhdeksänsadan sylen pituudelta rätisi rakennusten palo keskipihan


oikealla ja vasemmalla laidalla. Sää oli raskas, eikä
tuulenhenkäystäkään käynyt. Palavien rakennusten ja ruudin savu
painui taistelevien päälle kuin lyijykupu. Koko julkipuoli, jonka kaikki
ikkunat liekehtivät, peittyi savuharsoon. Ei nähty, minne kuolemaa
syydettiin, eikä liioin, mistä se tuli.

Pitou, Billot ja marseillelaiset etenivät hyökkäysjoukon kärkenä ja


saapuivat savun seassa eteiseen. Ja näin he joutuivat pistinseinän,
sveitsiläisten aseitten, eteen.
Sveitsiläiset aloittivat peräytymisensä, sankarillisen peräytymisen,
jolloin he askel askelelta, porras paltaalta jättivät omia miehiään
porraskiville virumaan -hitaasti liikkuessaan. Illalla laskettiin portailla
kahdeksankymmentä ruumista.

Äkkiä kajahti palatsin huoneista ja käytävistä huuto:

»Kuningas käskee sveitsiläisten lopettaa ammunnan »

Kello oli tällöin kaksi iltapäivällä.

Katsokaamme, mitä sillä välin oli tapahtunut kansalliskokouksessa


ja mikä oli aiheuttanut määräyksen, että ammunta oli lopetettava,
minkä piti lauhduttaa voittajien raivoa ja seppelöidä voitetut
kunnialla.

Kun Feuillants-portti oli sulkeutunut kuningattaren takana ja


kuningatar oli puoliavoimesta ovesta nähnyt rautakankien, pistinten
ja piikkien uhkaavan Charnyta, oli hän huudahtanut ja ojentanut
kätensä ovea kohden. Mutta saattoväki tempasi hänet mukaansa
saliin päin, ja kun äidin vaisto samalla kiihoitti häntä sinne, missä
hänen lapsensa oli, seurasi hän kuningasta kansalliskokouksen
istuntosaliin.

Siellä odotti häntä suuri ilo. Hän näki poikansa istumassa


puheenjohtajan pöydällä. Mies, joka oli kantanut hänet sisälle,
heilutteli voitonriemuisesti punaista myssyään nuoren prinssin pään
päällä ja huusi iloisena:

»Minä olen pelastanut valtiaitteni pojan! Eläköön hänen


korkeutensa kruununprinssi!»
Kun kuningatar näki poikansa olevan turvassa, palasivat hänen
ajatuksensa heti Charnyyn..

»Hyvät herrat», sanoi hän, »muuan kaikkein urheimpia


upseereitani, kaikkein uskollisimpia palvelijoitani on jäänyt oven
ulkopuolelle kuolemanvaaraan. Pyydän teitä rientämään hänen
avukseen.»

Viisi kuusi edustajaa kiiruhti ulos.

Kuningas, kuningatar, kuninkaallinen perhe ja heidän seuralaisensa


siirtyivät ministerien istuimille.

Kansalliskokous otti heidät vastaan seisomaan nousten. Se ei


merkinnyt suinkaan kruunatuille päille osoitettua kohteliaisuutta,
vaan onnettomuuden kunnioittamista.

Ennen istuutumistaan kuningas viittasi kädellään haluavansa


puhua.

»Olen tullut tänne», sanoi hän hiljaisuuden vallitessa, »estääkseni


suuren rikoksen tapahtumasta. Olen arvellut, etten voisi saada
parempaa turvaa muualta kuin teidän keskuudestanne.»

»Sire», vastasi Vergniaud, joka sinä päivänä oli puheenjohtajana,


»voitte luottaa kansalliskokouksen lujuuteen. Sen jäsenet ovat
vannoneet kuolevansa puolustaessaan kansan oikeuksia ja
perustuslain mukaisia hallintoelimiä.»

Kuningas istuutui.

Juuri sillä hetkellä kajahti hirveä yhteislaukaus Maneesin porttien


kohdalla. Kapinallisten joukkoon liittyneet kansalliskaartilaiset
ampuivat Feuillants-pengermältä kapteenia ja niitä sveitsiläisiä, jotka
olivat saattaneet kuninkaallista perhettä.

Muuan kansalliskaartin upseeri, joka arvatenkin oli menettänyt


malttinsa, syöksyi kuohuissaan istuntosaliin huutaen:

»Sveitsiläiset tulevat! Meidät on saarrettu!»

Kansalliskokous luuli aluksi, että sveitsiläiset olivat tukehduttaneet


kapinan ja marssivat nyt voittajina Maneesiin vapauttaakseen
kuninkaansa — Ludvig XVI olikin sillä hetkellä pikemmin sveitsiläisten
kuin ranskalaisten kuningas.

Koko sali nousi seisaalleen kuin yhtenä miehenä. Kansanedustajat,


parvekeyleisö, kansalliskaartilaiset, kirjurit, kaikki kohottivat kätensä
ja huusivat:

»Mitä tapahtuneekin, me vannomme elävämme ja kuolevamme


vapaina!»

Kuninkaalla ja hänen perheellään ei ollut mitään yhteistä tähän


valaan. He jäivätkin istumaan. Kolmentuhannen suun päästämä
huuto kulki kuin myrskyvihuri heidän päänsä yli.

Erehdys ei tullut pitkäaikaiseksi, mutta tämä innostuksen hetki oli


vaikuttanut ylevältä.

Neljännestuntia myöhemmin kuului uusi huuto:

»Palatsi on vallattu! Hyökkääjät marssivat kansalliskokoukseen


surmatakseen kuninkaan!»
Silloin samat miehet, jotka kuninkuutta vihaten olivat juurikään
vannoneet kuolevansa vapaina, nousivat yhtä yksimielisesti kuin
äskenkin vannomaan puolustavansa kuningasta kuolemaan asti.
Samalla hetkellä kehoitettiin sveitsiläisten kapteenia Dürleriä
kansalliskokouksen nimessä luopumaan aseistaan.

»Minä palvelen kuningasta enkä kansalliskokousta», vastasi


kapteeni.
»Missä on kuninkaan määräys?»

Kansalliskokouksen läheteillä ei ollut kirjallista määräystä.

»Olen saanut valtuuteni kuninkaalta», jatkoi Dürler, »ja vain


kuninkaalle annan sen takaisin».

Hänet vietiin melkein väkivalloin kansalliskokoukseen. Hän oli


ruudinsavun mustaama ja yltyleensä veressä.

»Sire», sanoi hän, »minua kehoitetaan laskemaan aseet. Onko se


kuninkaan tahto?»

»On», vastasi Ludvig XVI, »luovuttakaa aseenne kansalliskaartille.


En halua, että teidänlaisenne urheat miehet tuhoutuvat.»

Dürler painoi päänsä, huoahti ja poistui, mutta ovelta hän sanoi


noudattavansa vain kirjallista määräystä.

Silloin kuningas kirjoitti paperilapulle:

»Kuningas käskee sveitsiläisten luopua aseistaan ja vetäytyä


kasarmeihinsa.»

Sitä käskyä toistettiin Tuileriein huoneissa, käytävissä ja portailla.


Kun tämä määräys tyynnytti kansalliskokousta jonkun verran, soitti
puheenjohtaja kelloa.

»Neuvotelkaamme», sanoi hän.

Mutta silloin muuan edustaja nousi tuoliltaan ja huomautti, että


perustuslain se ja se kohta kielsi neuvottelun kuninkaan läsnäollessa.

»Se on totta», myönsi Ludvig XVI, »mutta minne voimme


mennä?»

»Sire», vastasi puheenjohtaja, »voimme tarjota teille Logographe-


lehden aition, joka on tyhjä, sillä lehti on lakannut ilmestymästä».

»Hyvä on», sanoi kuningas, »olemme valmiit siirtymään sinne».

»Vahtimestarit», virkkoi Vergniaud, »opastakaa kuningas


Logographen aitioon».

Vahtimestarit riensivät noudattamaan käskyä. Kuningas,


kuningatar ja kuninkaallinen perhe poistuivat salista samaa tietä,
jota olivat tulleetkin, ja joutuivat käytävään.

»Mitä on tuossa permannolla?» kysyi kuningas. »Se näyttää


vereltä!»

Vahtimestarit eivät vastanneet. Mikäli tahrat tosiaankin olivat


veritahroja, eivät he kaiketikaan tienneet, kuinka ne olivat
permannolle ilmestyneet. Omituista kyllä, tahrat olivat isompia, ja
niitä oli tiheämmässä, mitä lähemmäksi tultiin aitiota.

Säästääkseen kuningatarta näkemästä näitä inhoittavia merkkejä


kuningas kiirehti askeliaan ja aukaisi itse aition oven.
»Madame, astukaa sisään», kehoitti hän.

Kuningatar meni hänen ohitseen, mutta astuessaan kynnykselle


hän parahti kauhistuksesta, nosti kädet silmilleen ja horjahti
taaksepäin. Veritahrat saivat selityksensä: aitioon oli tuotu miehen
ruumis, johon kuningatar kiireissään oli ollut vähällä satuttaa
jalkansa.

»Kas, se on poloisen kreivi de Charnyn ruumis!» sanoi kuningas


samalla äänellä, jolla hän oli varemmin sanonut: »Kas, se on
poloisen herra Mandatin pää!»

Se oli tosiaankin kreivin ruumis. Kansanedustajat olivat riistäneet


sen murhaajien käsistä ja käskeneet viedä sen Logographen aitioon
aavistamatta, että sinne sijoitettaisiin kymmentä minuuttia
myöhemmin kuninkaallinen perhe.

Ruumis vietiin nyt pois ja kuninkaallinen perhe astui aitioon.

Sen lattia aiottiin pestä ja kuivata verestä puhtaaksi, mutta


kuningatar teki kieltävän kädenliikkeen ja istuutui ensimmäisenä.
Kukaan ei huomannut, että hän päästi kenkiensä paulat ja painoi
vapisevat jalkansa yhä lämpöiseen vereen.

»Ah, Charny, Charny», kuiskasi hän, »miksei minunkin vereni


vuoda täällä viimeiseen pisaraan saakka yhtyäkseen ikuisesti sinun
vereesi…!»

Tornikello löi tällöin kolme kertaa.


XXXIII

Kello kolmesta kuuteen

Lähdimme palatsista juuri silloin kun keskieteiseen hyökättiin,


sveitsiläiset peräytyivät verkalleen kuninkaan huoneistoja kohden ja
huoneista ynnä käytävistä huudettiin:

»Sveitsiläisten käsketään luopua aseistaan!»

Tämä teos on varmaankin viimeinen, jonka kirjoitamme tästä


hirveästä aikakaudesta. Mikäli kuvauksemme jatkuu, poistumme
maaperältä, jolla olemme liikkuneet, palaamatta sille enää
milloinkaan. Se oikeuttaa meidät esittämään lukijoille tämän
ratkaisevan päivän kaikkine yksityispiirteineen. Siihen meillä on
sitäkin suurempi oikeus, kun teemme sen ennakkoluulottomasti,
vihatta ja puolueettomasti.

Lukija on astunut Royale-pihaan marseillelaisten perässä. Hän on


seurannut Billotia savuun ja tuleen ja nähnyt hänen yhdessä Pitoun,
vainajien parista nousseen verisen haamun, kanssa nousseen
portaitten yläpäähän, minne jätimme heidät toistaiseksi.
Tästä hetkestä alkaen Tuileriein palatsi oli vallattu.

Mikä synkeä henki oli sanellut tämän voiton?

Kansan viha, vastattaneen. Epäilemättä. Mutta kuka johti tätä


vihaa?

Mies, jonka nimen olemme ohimennen maininneet, se


preussilainen upseeri, joka istui pienen mustan ratsun selässä
jättiläiskokoisen Santerren ja tämän toimenantajansa komean
flaamilaishevosen vieressä — elsassilainen Westermann.

Kuka oli tämä mies, joka salaman lailla leimahti esille vain ukkosen
riehuessa?

Hän oli niitä miehiä, joita Jumala pitää kätkettyinä vihansa


asevarastossa ja jotka hän sinkoaa pimeästä esille silloin, kun vihan
hetki on lyönyt.

Hänen nimensä oli Westermann, laskevan auringon mies.

Ja hän ilmestyi tosiaankin hetkellä, jolloin kuninkuus painui


mailleen milloinkaan enää nousematta.

Kuka hänet oli keksinyt ja löytänyt? Kuka oli toiminut välittäjänä


hänen ja Jumalan välillä? Kuka oli käsittänyt, että oluenpanijalle,
aineellisen lihan möhkäleelle, oli avuksi annettava sielu taistelua
varten, missä titaanit syöksisivät jumalan alas valtaistuimelta? Kuka
täydensi Santerren Westermannilla?

Sen teki Danton.


Mistä tämä peloittava kansanpuhuja oli löytänyt tämän voittajan?
Inhoittavasta loukosta, katuojasta, vankilasta, Saint-Lazaresta!

Westermannia oli syytetty — huomatkaa tarkoin, syytetty, muttei


todistettu vikapääksi — väärien setelien valmistamisesta, ja hän oli
epäluulon alaisena pidätetty.

Danton tarvitsi elokuun 10 päiväksi miestä, joka ei pelkäisi mitään,


sillä pelko veisi suoraa päätä kaakinpuuhun. Hän oli pitänyt silmällä
tuota salaperäistä vankia, ja kun hetki tuli, jolloin tätä miestä
tarvittiin, mursi hän väkevällä kädellään salvat ja kahleet ja sanoi
vangille: »Tule!»

Kuten olemme joskus sanoneet, ei vallankumous ole ainoastaan


siinä, että halvat kohoavat arvoon, vaan myöskin siinä, että vangit
pääsevät vapaiksi ja vapaat pannaan vankilaan, eikä vain vapaat,
vaan vieläpä maan mahtavat, isoiset, ruhtinaat ja kuninkaat!

Varmaankin juuri siksi, että Danton oli varma tapahtumien


vääjäämättömästä kulusta, hän oli esiintynyt niin laimeana siinä
kuumeisessa hämärässä, joka edelsi elokuun 10 päivän
verenkarvaista sarastusta.

Edellisenä iltana hän oli kylvänyt tuulta. Hänen ei tarvinnut olla


huolestunut. Hän tiesi saavansa niittää myrskyä.

Se tuuli oli Westermann, ja myrsky oli Santerre, kansan


jättimäinen ilmennys.

Santerre tuskin näyttäytyikään sinä päivänä. Westermann teki


kaikki, oli kaikkialla.
Westermann oli johtanut Saint-Marceaun ja Saint-Antoinen
esikaupunkilaisten liikkeitä Pont-Neufillä; pienen mustan ratsunsa
selässä hän oli armeijan etunenässä ilmestynyt Carrousel-aukion
ristikkoporttien eteen ja kolkuttanut miekkansa ponnella Tuileriein
portille ikäänkuin olisi avauttanut jonkun kasarmin oven.

Olemme nähneet, kuinka tämä portti aukaistiin, kuinka sveitsiläiset


sankarillisina täyttivät velvollisuutensa, kuinka he peräytyivät
pakenematta, kuinka he tuhoutuivat voittamattomina. Olemme
seuranneet heitä porras portaalta vainajien kattamassa eteisessä.
Seuratkaamme heitä askel askeleelta Tuileriein palatsissa, joka pian
täyttyi heidän ruumiistaan.

Kun saapui tieto, että kuningas oli lähtenyt palatsista, kerääntyivät


ne kaksi-kolmesataa aatelista, jotka olivat tulleet kuolemaan
kuninkaan kanssa, kuningattaren henkivartijasaliin neuvotellakseen,
olisiko heidän nyt, kun kuningas ei enää ollut paikalla kuollakseen
heidän kanssansa, kuten oli juhlallisesti luvannut, kuoltava ilman
häntä.

He päättivät, että koska kuningas oli mennyt kansalliskokoukseen,


hekin lähtisivät sinne liittyäkseen kuninkaan saattueeseen.

He keräsivät kaikki sveitsiläiset, jotka tavattiin, lisäksi


parikymmentä kansalliskaartilaista, ja viiden sadan miehen
vahvuisena joukkona he laskeutuivat puutarhaan.

Käytävän sulki ristikkoportti, jota sanottiin kuningattaren portiksi.


Sen lukko aiottiin murtaa, mutta lukko kesti.

Joukon väkevimmät alkoivat kiskoa irti ristikkokankea ja


onnistuivatkin yrityksessään. Mutta näin syntyneestä aukosta pääsi
ulos vain mies kerrallaan.

Oltiin noin kolmenkymmenen askelen päässä Royal-sillan


ristikkoportille sijoitetusta pataljoonasta.

Ahtaasta aukosta pujahti ulos ensiksi kaksi sveitsiläistä. Molemmat


suistuivat maahan, ennenkuin olivat astuneet neljääkään askelta.
Kaikkien toisten täytyi hypätä heidän ruumiittensa yli.

Joukkoa vastaan tuiskahti luotisade. Mutta koska sveitsiläisten


helakanväriset asetakit tarjosivat hyvän maalitaulun, osuivat luodit
etupäässä juuri heihin. Kun kaksi aatelismiestä sai surmansa ja yksi
haavoittui, kaatui samaan aikaan kuusi-seitsemänkymmentä
sveitsiläistä.

Surmansa saaneet aatelismiehet olivat de Carteja ja de Clermont


d'Amboise. Haavoittunut aatelismies oli de Viomesnil.

Marssiessaan maneesille päin joukko sivuutti erään vartioston,


joka oli sijoitettu puiden alle laituripengermälle. Vartiosto tuli esille ja
laukaisi kiväärinsä: kaksikymmentä sveitsiläistä kaatui.

Pakeneva joukko, joka kahdeksallakymmenellä askeleella oli


menettänyt kahdeksankymmentä miestä, suuntasi kulkunsa
Feuillants-portaille.

Choiseulin herttua näki heidät kaukaa ja juoksi miekka kädessä


heitä turvaamaan, uhmaten Royal- ja Tournant-siltojen tykkejä.

»Kansalliskokoukseen!» huusi hän.

Ja arvellen, että häntä seurasivat ne neljäsataa miestä, jotka vielä


olivat hengissä, hän riensi edellä käytäviin ja saapui portaille, joista
pääsi istuntosaliin. Alimmalla portaalla hän tapasi Merlinin.

»Mitä te täällä, onneton, paljastettu miekka kädessä?» sanoi


hänelle kansanedustaja.

Herttua silmäili ympärilleen: hän oli yksin.

»Pankaa miekka tuppeen ja menkää kuninkaan luokse», kehoitti


Merlin.
»Vain minä olen nähnyt teidät, kukaan siis ei ole nähnyt teitä.»

Kuinka oli käynyt joukon, jonka herttua oli luullut seuranneen


jäljestä?

Tykki- ja kiväärituli oli ravistellut sitä kuin pyörretuuli kuivia lehtiä


ja ajanut sen Orangerie-pengermälle. Siellä pakenijat hyppäsivät
Ludvig XV:n torille ja suuntasivat askelensa Garde-Meublea kohden,
päästäkseen sitä tietä bulevardeille tai Champs-Elyséesille.

Herra de Viomesnil, kymmenkunta aatelismiestä ja viisi


sveitsiläistä pujahtivat Venetsian lähetystötaloon, joka oli Saint-
Florentin-kadun varrella ja jonka portin he huomasivat olevan auki.
He pelastuivat! Mutta muu joukko pyrki Champs-Elyséesille.

Ludvig XV:n patsaan juurelta jyrähti kaksi tykinlaukausta, ja niiden


haulipanokset hajoittivat joukon kolmeen ryhmään.

Yksi ryhmä pakeni bulevardeille ja kohtasi matkalla santarmiston,


joka oli tulossa Capucines-piirin pataljoonan kanssa.

Pakolaiset luulivat pelastuneensa. Herra de Villiers, santarmiston


entinen ajutantti, juoksi kädet koholla muuatta ratsumiestä kohden
ja huusi: »Apuun, ystävät!»
Ratsumies tempasi pistoolinsa ja ampui hänen päänsä puhki.
Tämän nähdessään kolmekymmentä sveitsiläistä ja yksi aatelismies,
joka oli entinen kuninkaan hovipoika, pakenivat meriministeriön
taloon. Siellä he neuvottelivat, mitä olisi tehtävä.

Sveitsiläiset päättivät antautua ja nähdessään kahdeksan


sanskulotin lähestyvän he laskivat kiväärit jalalle ja huusivat:
»Eläköön kansa.»

»Haa, petturit!» vastattiin heille. »Te antaudutte, koska huomaatte


olevanne satimessa. Te huudatte eläköötä kansalle, koska luulette
sen huudon pelastavan teidät! Ei, ei armoa!»

Ja samassa kaksi sveitsiläistä kaatui, toinen piikin lävistämänä,


toinen luodin surmaamana.

Heti katkaistiin heidän kaulansa, ja päät pantiin kahden piikin


kärkeen.

Sveitsiläiset raivostuivat kahden toverinsa surmaamisesta,


kohottivat jälleen kiväärinsä ja laukaisivat kaikki yhtaikaa.
Kahdeksasta laukauksesta seitsemän kaatui kuolleena tai
haavoittuneena. Sitten sveitsiläiset ryntäsivät isoon porttikäytävään
suojaa hakeakseen, mutta joutuivat tykinsuun eteen.

He peräytyivät. Tykki siirtyi sitä mukaa. Miehet kasaantuivat pihan


nurkkaan. Tykki käännettiin, sen piippu suunnattiin miehiin päin ja
laukaistiin. Kahdeksastakolmatta kaatui kolmekolmatta.

Savun sokaistessa laukaisijain silmät aukeni pieni portti viiden


jäljelle jääneen sveitsiläisen ja entisen hovipojan takana.
Kaikki kuusi syöksyivät sisään tästä portista, joka heti sulkeutui
heidän jälkeensä. Isänmaanystävät eivät huomanneet tätä
salaluukun tapaista porttia, joka oli riistänyt heiltä kuusi uhria. He
luulivat surmanneensa kaikki ja poistuivat, laahaten tykin mukanaan
ja huutaen voittoaan.

Toisessa ryhmässä oli kolmisenkymmentä sotilasta ja


aatelismiestä. Sitä johti Forestier de Saint-Venant. Champs-Elyséesin
sisäänkäytävän kohdalla miesjoukko saarrettiin kaikilta tahoilta.
Päällikkö tahtoi myydä henkensä niin kalliisti kuin mahdollista.
Kolmenkymmenen miehensä etunenässä, hänellä miekka kädessä,
miehillä pistinkiväärit, hän ryntäsi kolmesti kokonaista pataljoonaa
vastaan, joka oli sijoittunut patsaan juurelle. Näissä kolmessa
hyökkäyksessä hän menetti viisitoista miestä.

Viidentoista eloon jääneen kanssa hän yritti päästä erään


aukeaman yli ja sitä tietä Champs-Elyséesille. Yhteislaukaus kaatoi
häneltä kahdeksan miestä. Seitsemän jäljelle jäänyttä hajaantui eri
suunnille. Heitä ajettiin takaa, ja santarmisto hakkasi heidät maahan.

Herra de Saint-Venant etsi suojaa Ambassadeur-kahvilasta. Silloin


muuan santarmi karautti ratsunsa hyppäämään yli ojan, joka erotti
jalkakäytävän kadusta, ja ampui pistoolilla poloista päällikköä
selkään.

Kolmas ryhmä, jossa oli kuusikymmentä miestä, ohi päässyt


Champs-Elyséesille ja suuntasi kulkunsa Courbevoieen
vaistomaisesti,
kuten kyyhkyset lentävät lakkaansa ja lampaat pyrkivät tarhaansa.
Courbevoiessa sijaitsivat näet kasarmit.
Ratsastavan santarmiston ja kansan ympäröimänä tätä ryhmää
lähdettiin kuljettamaan kaupungintaloon, missä heidät luultiin
saatavan turvaan. Pari-kolmetuhatta raivopäätä, jotka olivat
sulloutuneet Grève-torille, riisti vangit saattajiltaan ja teurasti heidät.

Muuan nuori aatelismies, ritari Charles d'Autichamps, pakeni


palatsista
Echelle-kadulle, pistooli kummassakin kädessä. Pari miestä yritti
häntä
vangita. Hän ampui molemmat. Rahvas otti hänet kiinni ja laahasi
häntä
Grève-torille, missä aiottiin hänet juhlallisesti teloittaa.

Mutta miehen onneksi unohdettiin tutkia hänen taskunsa.


Hyödyttömien pistoolien tilalla, jotka hän oli viskannut menemään,
hänellä oli veitsi. Hän väänsi sen auki taskussaan ja odotti sopivaa
hetkeä sitä käyttääkseen. Kun hän saapui kaupungintalon edustalle,
surmattiin siellä paraikaa vangiksi saatuja kuuttakymmentä
sveitsiläistä. Tämä näky kiihdytti niiden uteliaisuutta, jotka vartioivat
nuorukaista. Hän iski veitsellään kaksi lähinnä seisovaa miestä
kuoliaiksi, pujahti sitten väkijoukkoon kuin käärme ja katosi.

Ne sata miestä, jotka saattoivat kuningasta kansalliskokoukseen ja


jotka Feuillants-pihalla riisuttiin aseista, ne viisisataa, joiden vaiheet
juuri olemme kertoneet, ne harvat pakolaiset, jotka, kuten Charles
d'Autichamps, pelastuivat kuin ihmeen avulla, olivatkin ainoat, jotka
pääsivät pois palatsista.

Kaikki muut oli surmattu, mikä eteisessä mikä portailla, mikä


sisähuoneissa tai kappelissa.
Yhdeksänsataa ruumista, aatelismiesten ja sveitsiläisten, virui
Tuileriein seinien sisällä!
*** END OF THE PROJECT GUTENBERG EBOOK MARSELJEESI ***

Updated editions will replace the previous one—the old editions will
be renamed.

Creating the works from print editions not protected by U.S.


copyright law means that no one owns a United States copyright in
these works, so the Foundation (and you!) can copy and distribute it
in the United States without permission and without paying
copyright royalties. Special rules, set forth in the General Terms of
Use part of this license, apply to copying and distributing Project
Gutenberg™ electronic works to protect the PROJECT GUTENBERG™
concept and trademark. Project Gutenberg is a registered trademark,
and may not be used if you charge for an eBook, except by following
the terms of the trademark license, including paying royalties for use
of the Project Gutenberg trademark. If you do not charge anything
for copies of this eBook, complying with the trademark license is
very easy. You may use this eBook for nearly any purpose such as
creation of derivative works, reports, performances and research.
Project Gutenberg eBooks may be modified and printed and given
away—you may do practically ANYTHING in the United States with
eBooks not protected by U.S. copyright law. Redistribution is subject
to the trademark license, especially commercial redistribution.

START: FULL LICENSE


THE FULL PROJECT GUTENBERG LICENSE
PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK

To protect the Project Gutenberg™ mission of promoting the free


distribution of electronic works, by using or distributing this work (or
any other work associated in any way with the phrase “Project
Gutenberg”), you agree to comply with all the terms of the Full
Project Gutenberg™ License available with this file or online at
www.gutenberg.org/license.

Section 1. General Terms of Use and


Redistributing Project Gutenberg™
electronic works
1.A. By reading or using any part of this Project Gutenberg™
electronic work, you indicate that you have read, understand, agree
to and accept all the terms of this license and intellectual property
(trademark/copyright) agreement. If you do not agree to abide by all
the terms of this agreement, you must cease using and return or
destroy all copies of Project Gutenberg™ electronic works in your
possession. If you paid a fee for obtaining a copy of or access to a
Project Gutenberg™ electronic work and you do not agree to be
bound by the terms of this agreement, you may obtain a refund
from the person or entity to whom you paid the fee as set forth in
paragraph 1.E.8.

1.B. “Project Gutenberg” is a registered trademark. It may only be


used on or associated in any way with an electronic work by people
who agree to be bound by the terms of this agreement. There are a
few things that you can do with most Project Gutenberg™ electronic
works even without complying with the full terms of this agreement.
See paragraph 1.C below. There are a lot of things you can do with
Project Gutenberg™ electronic works if you follow the terms of this
agreement and help preserve free future access to Project
Gutenberg™ electronic works. See paragraph 1.E below.

You might also like