Dr. Dobb's is part of the Informa Tech Division of Informa PLC

This site is operated by a business or businesses owned by Informa PLC and all copyright resides with them. Informa PLC's registered office is 5 Howick Place, London SW1P 1WG. Registered in England and Wales. Number 8860726.

Channels ▼

Object-Oriented Analysis and Design, Part 2

June 1998/Object-Oriented Analysis and Design, Part 2/Sidebar

About the Code

The code in Listings 1 and 2 was compiled with Microsoft Visual C++ version 5.0 and Borland C++ version 5.02, and complies with the official ISO standard for C++ approved in November 1997. To save space, all functions are defined in situ, i.e., inside their respective class definitions. The code is intentionally not too "bulletproof" so as not to obscure the expression of Alistair's design. I did take some liberties as implementer, however. You will note that I made generous use of the heap via the new and delete operators.

This approach allows for flexible relationships between objects, and reflects the fact that most of the objects in the design are all "first class," i.e., they have a life of their own. This requires a clear policy of who owns which object, so objects get cleaned up properly in destructors. For example, a Recipe is made up of Ingredients, but each Dispenser owns its Ingredient and is responsible for deleting it. In this implementation, the following relationships hold:

CoffeeMachine owns: the Selector, the Cashbox

Selector owns: the DispenserRegister, the ProductRegister

DispenserRegister owns: all Dispensers

ProductRegister owns: all Products

Dispenser owns: an Ingredient

Product owns: a Recipe

Recipe uses: selected Ingredients

I also made use of the containers in the Standard Library where it made sense. For example, Recipe is basically a vector of Ingredients, and ProductRegister uses a vector of Products. Note that the DispenserRegister uses a map to associate Ingredients with their Dispensers for fast lookup when making a Recipe.

Like last month, I use <stdio.h> instead of <iostream>, mainly because the getline function doesn't work as expected with console input. To make the code port between the two compilers, the following unusual "features" appear:

* DispenserRegister::dispenserOf could not be made const, although it should be (Visual C++ didn't like it).

* The map defined in DispenserRegister needs the third template argument, less<const Ingredient*, Dispenser>, because Borland doesn't support default template arguments and didn't provide overloads as a work-around.

* In ~DispenserRegister I would have used p->second instead of (*p).second, but Borland gets confused (the ++ is immaterial for this issue). Chuck Allison o

Related Reading

More Insights

Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.