Table Of Contents
Preface.Prelude.
First Try.
Doing it without Classes.
Why was it Easier in C++?
A Bigger Example.
Conclusion.
Doing it without Classes.
Why was it Easier in C++?
A Bigger Example.
Conclusion.
I. MOTIVATION.
1. Why I Use C++.
The Problem.
History and Context.
Automatic Software Distribution.
Enter C++.
Recycled Software.
Postscript.
History and Context.
Automatic Software Distribution.
Enter C++.
Recycled Software.
Postscript.
2. Why I Work on C++.
The Success of Small Projects.
Abstraction.
Machines Should Work for People.
Abstraction.
Machines Should Work for People.
3. Living in the Real World.
II. CLASSES aND INHERITANCE.
4. Checklist for Class Authors.5. Surrogate Classes.
The Problem.
The Classical Solution.
Virtual Copy Functions.
Defining a Surrogate Class.
Summary.
The Classical Solution.
Virtual Copy Functions.
Defining a Surrogate Class.
Summary.
6. Handles: Part 1.
The Problem.
A Simple Class.
Attaching a Handle.
Getting at the Object.
Simple Implementation.
Use-Counted Handles.
Copy on Write.
Discussion.
A Simple Class.
Attaching a Handle.
Getting at the Object.
Simple Implementation.
Use-Counted Handles.
Copy on Write.
Discussion.
7. Handles: Part 2.
Review.
Separating the use Count.
Abstraction of use Counts.
Access Functions and Copy on Write.
Discussion.
Separating the use Count.
Abstraction of use Counts.
Access Functions and Copy on Write.
Discussion.
8. An Object-Oriented Program.
The Problem.
An Object-Oriented Solution.
Handle Classes.
Extension 1: New Operations.
Extension 2: New Node Types.
Reflections.
An Object-Oriented Solution.
Handle Classes.
Extension 1: New Operations.
Extension 2: New Node Types.
Reflections.
9. Analysis of a Classroom Exercise: Part 1.
The Problem.
Designing the Interface.
A Few Loose Ends.
Testing the Interface.
Strategy.
Tactics.
Combining Pictures.
Conclusion.
Designing the Interface.
A Few Loose Ends.
Testing the Interface.
Strategy.
Tactics.
Combining Pictures.
Conclusion.
10. Analysis of a Classroom Exercise: Part 2.
Strategy.
Exploiting the Structure.
Conclusion.
Exploiting the Structure.
Conclusion.
11. When not to use Virtual Functions.
The Case For.
The Case Against.
Destructors are Special.
Summary.
The Case Against.
Destructors are Special.
Summary.
III. TEMPLATES.
12. Designing a Container Class.
What Does it Contain?
What Does Copying the Container Mean?
How Do You Get at Container Elements?
How Do You Distinguish Reading from Writing?
How Do You Handle Container Growth?
What Operations Does the Container Provide?
What Do You Assume about the Container Element Type?
Containers and Inheritance.
Designing an Arraylike Class.
What Does Copying the Container Mean?
How Do You Get at Container Elements?
How Do You Distinguish Reading from Writing?
How Do You Handle Container Growth?
What Operations Does the Container Provide?
What Do You Assume about the Container Element Type?
Containers and Inheritance.
Designing an Arraylike Class.
13. Accessing Container Elements.
Imitating a Pointer.
Getting at the Data.
Remaining Problems.
Pointer to Const Array.
Useful Additions.
Getting at the Data.
Remaining Problems.
Pointer to Const Array.
Useful Additions.
14. Iterators.
Completing the Pointer Class.
What is an Iterator?
Deleting an Element.
Deleting the Container.
Other Design Considerations.
Discussion.
What is an Iterator?
Deleting an Element.
Deleting the Container.
Other Design Considerations.
Discussion.
15. Sequences.
The State of the Art.
A Radical Old Idea.
Well, Maybe a Few Extras.
Example of Use.
Maybe a Few More.
Food for Thought.
A Radical Old Idea.
Well, Maybe a Few Extras.
Example of Use.
Maybe a Few More.
Food for Thought.
16. Templates as Interfaces.
The Problem.
The First Example.
Separating the Iteration.
Iterating Over Arbitrary Types.
Adding Other Types.
Abstracting the Storage Technique.
The Proof of the Pudding.
Summary.
The First Example.
Separating the Iteration.
Iterating Over Arbitrary Types.
Adding Other Types.
Abstracting the Storage Technique.
The Proof of the Pudding.
Summary.
17. Templates and Generic Algorithms.
A Specific Example.
Generalizing the Element Type.
Postponing the Count.
Address Independence.
Searching a Nonarray.
Discussion.
Generalizing the Element Type.
Postponing the Count.
Address Independence.
Searching a Nonarray.
Discussion.
18. Generic Iterators.
A Different Algorithm.
Categories of Requirements.
Input Iterators.
Output Iterators.
Forward Iterators.
Bidirectional Iterators.
Random-Access Iterators.
Inheritance?
Performance.
Summary.
Categories of Requirements.
Input Iterators.
Output Iterators.
Forward Iterators.
Bidirectional Iterators.
Random-Access Iterators.
Inheritance?
Performance.
Summary.
19. Using Generic Iterators.
Iterator Types.
Virtual Sequences.
An Output-Stream Iterator.
An Input-Stream Iterator.
Discussion.
Virtual Sequences.
An Output-Stream Iterator.
An Input-Stream Iterator.
Discussion.
20. Iterator Adaptors.
An Example.
Directional Asymmetry.
Consistency and Asymmetry.
Automatic Reversal.
Discussion.
Directional Asymmetry.
Consistency and Asymmetry.
Automatic Reversal.
Discussion.
21. Function Objects.
An Example.
Function Pointers.
Function Objects.
Function-Object Templates.
Hiding Intermediate Types.
One Type Covers Many.
Implementation.
Discussion.
Function Pointers.
Function Objects.
Function-Object Templates.
Hiding Intermediate Types.
One Type Covers Many.
Implementation.
Discussion.
22. Function Adaptors.
Why Function Objects?
Function Objects For Built-In Operators.
Binders.
A Closer Look.
Interface Inheritance.
Using These Classes.
Discussion.
Function Objects For Built-In Operators.
Binders.
A Closer Look.
Interface Inheritance.
Using These Classes.
Discussion.
IV. LIBRARIES.