void pointer syntax
    Ali Çehreli 
    acehreli at yahoo.com
       
    Tue May 15 19:30:47 PDT 2012
    
    
  
On 05/15/2012 07:01 PM, Stephen Jones wrote:
 > Using Object gives exactly the same problem as the Object super class
 > does not have vcount variable.
But Object is better than void* because the latter has no safety and 
completely unusable. All you can do with a void* is to cast it back to 
its own type. If you don't keep type information somehow, nobody knows 
what the original type was.
 > Casting is not a solution
That is the only solution. It may be somehow wrapped, but you must cast 
void* to a useful type first.
 > because the
 > reason for throwing different sorts of widgets into a single array was
 > so I did not have to track what each type of object was;
Yeah, great! That's polymorphism. Great. You keep a Widget[] and use it.
 > not tracking
 > what each object in the array is I have no means of knowing what to cast
 > each Widget in the array to.
Exactly! :) Either you or the compiler must keep track of it. void* 
removes any trace of type information.
 > If some one knows void pointer syntax that would be helpful.
import std.stdio;
void main()
{
     int i;
     double d;
     void*[] array;
     array ~= cast(void*)&i;
     array ~= cast(void*)&d;
     foreach (address; array) {
         writeln("I don't know what type of object is at ", address);
     }
}
 > As I
 > understand it there is a type called size_t that takes the address of as
 > a a value.
No. size_t is suitable to represent concepts like size, quantity, etc. 
Concepts that are supposed to be never less than zero.
 > Can I make an array of these and simply initialize each with
 > &button1, &cursor, etc? Also, how is size_t freed?
You can but it would make no sense:
import std.stdio;
void main()
{
     int i;
     double d;
     size_t[] array;
     array ~= cast(size_t)&i;
     array ~= cast(size_t)&d;
     foreach (size; array) {
         writeln("I don't know what to do with this amount: ", size);
     }
}
Getting back to your original question, here is another solution where 
Widget is a class (not an interface) that has a vertCount member. It 
makes it necessary that the subclasses construct it with that information:
import std.stdio;
class Widget{
     abstract void draw();
     size_t vertCount;
     this(size_t vertCount)
     {
         this.vertCount = vertCount;
     }
}
class Button : Widget{
     override void draw(){}
     this()
     {
         super(100);
     }
}
class Cursor : Widget{
     override void draw(){}
     this()
     {
         super(200);
     }
}
void main()
{
     Widget[] widgets;
     widgets~=new Button();
     widgets~=new Cursor();
     foreach(Widget w; widgets){
         writeln(w.vertCount);
     }
}
Ali
-- 
D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html
    
    
More information about the Digitalmars-d-learn
mailing list