Scope operator like in C++?

Steven Schveighoffer schveiguy at yahoo.com
Tue Mar 23 04:40:11 PDT 2010


On Tue, 23 Mar 2010 06:41:36 -0400, TimK <qwesxrfvzgb at web.de> wrote:

> Hi!
>
> I have a little (private) project in C++ and was thinking that I should  
> give D
> a chance (especially since it's not exactly new).
>
> So I have a class TPerson where the declaration is in the header file  
> and the
> definition in the cpp-source file. Naturally a defined function looks
> something like this:
>
> void TCharacter::DoSomething(int x){...}
>
> I do this for several reasons:
> - The class would get really awkward to read through and understand,  
> with all
> the code in it - so I usually just put the declaration and the  
> documentation
> for public functions into it.
> - a programmer who just wants to understand the class doesn't care about  
> the
> implementation.
>
> Now I tried to make a class in D, too, following this style.
> Unfortunately that doesn't work and I couldn't find a working  
> alternative in
> the documentation.
>
> Is this not possible in D?
> (I'm using GDC, so I guess it's still D 1.0)

First, welcome!

Second, GDC is horrifically old.  I'd recommend switching to ldc or the  
latest dmd 1.

Third, yes, it is somewhat possible.  But you have to think about it a  
different way.  When defining a class' implementation, you define  
everything inside the class.  This means that instead of this:

void TCharacter::DoSomething(int x){...}
int TCharacter::SomeOtherFunction() {...}

you do this:

class TCharacter
{
    void DoSomething(int x){...}
    int SomeOtherFunction(){...}
}

It actually turns out to be less code to write because you don't have to  
repeat the class name over and over, and it reads better IMO to someone  
trying to understand the implementation.

If you want to provide a "header file" for this, you may do so with a di  
file (d interface).  This file can have simply prototypes and  
documentation.  It will look exactly like your class definition, but does  
not need to contain your implementations.  In my example, the di file  
looks like this:

class TCharacter
{
    /**
     * Docs for DoSomething
     */
    void DoSomething(int x);

    /**
     * Docs for SomeOtherFunction()
     */
    int SomeOtherFunction();
}

The drawbacks of doing it this way are 1) you have to maintain two files  
instead of one, with almost identical contents and 2) di files without  
function implementations are not inlinable.

Note also, template functions must be included in the interface file,  
because the source must always be available to the compiler.

After explaining all that, and with my past experience with C++, I'd  
recommend *NOT* to do this.  The D compiler has a builtin documentation  
generator, so someone trying to use your functions will want to turn to  
that instead (much easier to read), and maintenance on two files that have  
to always be in sync is sucky to say the least.  The D compiler can  
auto-generate header files, but it is for the compiler's benefit, not a  
person's.  All docs are stripped out, and indentations are removed.  In  
addition, it tries to include implementations for functions which it  
thinks might be inlined.

For an example of what really good generated docs look like, see tango's  
docs: http://www.dsource.org/projects/tango/docs/current

My recommendation is to simply build your code inline, just like Java and  
C#, and use the doc generation tools to document your functions.  It will  
take some getting used to, but I think you will appreciate the  
single-point-of-editing aspect of it.

Good luck!

-Steve



More information about the Digitalmars-d mailing list