Re: Idiots
"Jerry Coffin" <jerryvcoffin@yahoo.com> wrote in message
news:MPG.262f9d31f62a702c989880@news.sunsite.dk...
In article <bZednVFnQ6c3TVjWnZ2dnUVZ8vydnZ2d@giganews.com>,
leigh@i42.co.uk says...
Not necessarily trying to contradict your conclusion, but it doesn't
look to me like everything you've said is entirely cut and dried.
1) Don't use the unsigned integral types despite the fact that
the C++ standard library is full of their use.
I could as well point out that the standard library contains quite a
few examples of statically allocated buffers and (worse) returning
pointers to those buffers to the user (e.g. many of the time-oriented
functions).
That was a reasonable decision when it was made, and now the standard
library is stuck with it, even though it's now far from ideal.
I was thinking more of the template containers and allocators rather than
the C runtime subset which is antiquated yes. std::size_t is used
extensively. You should use a container's public typedefs in client code
(i.e. size_type).
2) Don't use abstract interfaces (as they advocate against using
public virtual functions).
Nonsense! You can have abstract interfaces without public virtual
functions. At least AFAIK, this was first advocated by Herb Sutter,
who certainly is NOT an idiot (e.g. he is on the standard committee,
so he helped design a fair amount of what you're treating as
exemplary in your previous point).
Not nonsense, this what I mean by an abstract interface:
struct abstract_interface
{
virtual void foo() = 0;
virtual void bar() = 0;
};
i.e. a class type that contains pure virtual functions and nothing else, no
state, no invariants, no need for non-virtual wrappers. This is a perfectly
valid idiom and a counter-example to the "don't use public virtuals" mantra.
3) Never derive from standard containers despite the fact that
interface augmentation is useful.
...and yet, Alexander Stepanov, the guy who originally designed
those containers, publicly and explicitly states that he has no use
for inheritance at all. For example, see his comments at:
http://www.stlport.org/resources/StepanovUSA.html
Again, if you're going to use the standard library as an example, you
can quickly find that they don't use inheritance, even when one
provides essentially an augmented interface of another's. If you read
_Elements of Programming_ (by Alexander Stepanov and Paul McJones)
you'll quickly find strong indications that if he were designing this
part of the standard library again today, there's basically no chance
at all that he'd even consider using inheritance.
Wrong, the C++ standard library does advocate, nay, require inheritance,
look at std::iterator and std::binary_function.
Interface augmentation is quite valid, Bjarne Stroustrup advocates it in
TC++PL. I use it for my mutable_set class (see
http://www.i42.co.uk/stuff/mutable_set.htm).
/Leigh