JohnQ wrote:
> I like, non-copyable, non-assignable and, most often,
> non-default-constructable also, as a starting point for class design:
>
> class SomeClass
> {
> SomeClass(); // disallow default construction
> SomeClass(const SomeClass&); // disallow copy construction
> SomeClass& operator=(const SomeClass&); // disallow assignment
>
> public:
> // other allowed constructors, destructor, operators, functions
> } ;
>
> I'm swaying toward the thought that compiler-generated functions are a pain
> and go against logical language design: when not specified, a default
> constructor, a destructor, a copy constructor and an assignment operator are
> generated by the compiler. But to prevent them, you have to do typing as
> shown above, leaving out the implementation. Wouldn't it make more sense to
> say, "If it's not declared in the class declaration, then the class object
> instances will not have the behavior in the compiled code"? How
> counter-intuitive can one be?! To me, "what you see is what you get" seems
> better. Is there a good reason why it is like it is or could it have just as
> easily gone the other way? Which way would you prefer?
>
> John
>
>
BTW, John, here is an idea. I think you can use templates to help
create those concepts of non-copyable, etc. and derive from those
templates to insure the concept.
I hope this helps! BTW boost (
www.boost.org) has some examples of this
idea in practice.
http://www.boost.org/libs/utility/utility.htm
This shows the non-copyable concept.
As for non-default constructable, I am not sure but I thought that if
you only specify ctors that cannot be effectively reduced to a default
constructor, it means that your class is non-default constructable. eg.
Note: tested gcc3.4.3 and this class is non-default constructable.
class A
{
public:
A( int var );
};
This version can be default-constructable:
class A
{
public:
A( int var=0 );
};
Hope that helps!