'Undefined reference' linking errors

Ali Çehreli acehreli at yahoo.com
Thu Apr 8 10:34:18 PDT 2010


Joseph Wakeling wrote:

 >> - opCall() of AvgWeighted was abstract.
 >> - keep in mind that in D classes are CamelCase;
 >> - variable names are written like weightSum (but once in a while a 
underscore
 > doesn't kill).
 >
 > I think it's obvious from my syntax that my background is with C; I'm not
 > experienced with Java, C# etc.  This may explain some of the problems 
I'm having.
 >
 > Regarding opCall I was following the syntax described here:
 > http://www.digitalmars.com/d/2.0/operatoroverloading.html#FunctionCall
 >
 > ... but clearly without understanding it properly.

I have experience with C++ and still don't understand why opCall exists. 
:) I think I heard that opCall was needed to create struct objects 
before structs had constructors in D.

Now structs do have constructors, which sometimes conflict with opCall. :)

 > What I was aiming for was a bit smartarse -- to have a class which 
could in some
 > cases be treated as a function.

I consider myself a function-happy programmer. To me, not everything is 
a class. :)

 > Each of these classes (later ones will be more
 > sophisticated) is meant to be a data analysis tool which takes a 
dataset of
 > user-object ratings and user and object reputation values and helps 
aggregate the
 > ratings and in the process update the reputation values.
 >
 > The aim was that if you just wanted a once-off analysis you could use 
the class in
 > a throwaway fashion -- hence the use of,
 >
 >    avg_weighted(......);

It could be a function that instantiates on object, that would be thrown 
away.

 > It's maybe not the best way to approach what I want to do, but since 
D is a new
 > language for me, I thought I would be playful with it and try and 
bend it around
 > in some interesting ways.

No harm in that. :)

 >> - Be careful because ref arguments are tricky.
 >
 > The choice is deliberate here, because the arrays passed to the 
constructor (or
 > opCall) are meant to be modified.

D has "reference types". When you pass a class object to a function 
"by-value", it is actually passed-by-reference. I think this is the same 
in Java.

You can imagine the function parameter being a pointer behind the scenes.

ClassType variable = new ClassType;
ClassType variable2 = variable;

You have a single "object" created with new, and two "variables" that 
refer to that object.

 >> - There is a line like foreach (r; reputationUser) r = 1; that can 
be a bug.
 >
 > I guess that I should put a 'double' in front of the r, no?  In any 
case, I guess
 > there is a better way of setting all elements of an array equal to 1.0.

You would put 'ref' in front of the foreach variables. Otherwise they 
are copies in the foreach loop.

 >> - foreach (objectID, rating; reputationObject) rating /= 
weightSum[objectID];
 > can be another bug.
 >
 > ... so should be uint objectID, double rating ... ?

Same: Should probably be 'ref rating' if you want to modify 
reputationObject.

 > I think it's obvious that I want each the value of each element of
 > reputationObject to be divided by the value of the corresponding 
element of
 > weightSum -- is there a more intelligent way of doing this?

 >> - I suggest to add contracts and unittests.
 >
 > As you might have guessed, I'm not a developer -- can you provide 
more info?

They are of the greater features of D. :) You can define function pre- 
and post-conditions and struct and class invariants. You can have 
unittest blocks... Great stuff! :)

http://digitalmars.com/d/2.0/unittest.html

http://digitalmars.com/d/2.0/dbc.html

http://digitalmars.com/d/2.0/class.html#Invariant

Ali


More information about the Digitalmars-d-learn mailing list