void pointer syntax
Stephen Jones
siwenjo at gmail.com
Tue May 15 19:01:23 PDT 2012
On Monday, 14 May 2012 at 19:04:46 UTC, H. S. Teoh wrote:
> On Mon, May 14, 2012 at 08:40:30PM +0200, Stephen Jones wrote:
>> I want an array of different classes of objects. I tried to
>> subsume the differences by extending the classes under a single
>> interface/abstract class/super class (3 different approaches)
>> all
>> to no avail as I could not access the public variables of the
>> instantiated classes while storing them in an array defined by
>> the interface/super class.
> [...]
>
> Every class derives from Object, so an Object[] should do what
> you want.
>
> Also, if you need to access public variables of a derived
> class, you
> need to downcast:
>
> // Suppose this is your class heirarchy
> class Base { int x; }
> class Derived1 : Base { int y; }
> class Derived2 : Base { int z; }
>
> // Here's how you can put derived objects in a single array
> auto d1 = new Derived1();
> auto d2 = new Derived2();
> Base[] o = [d1, d2];
>
> // You can directly access base class members:
> o[0].x = 123;
> o[1].x = 234;
>
> // Here's how to downcast to a derived type
> Derived1 dp = cast(Derived1) o[0];
> if (dp !is null) {
> dp.y = 345;
> }
>
> Derived2 dp2 = cast(Derived2) o[1];
> if (dp2 !is null) {
> dp.z = 456;
> }
>
> Note that the if statements are necessary, since when
> downcasting you
> don't know if the given Base object is actually an instance of
> that
> particular derived object. If you tried cast(Derived1) o[1], it
> will
> return null because o[1] is not an instance of Derived1.
>
>
> T
Using Object gives exactly the same problem as the Object super
class does not have vcount variable. Casting is not a solution
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; not tracking what each object in the array is I have
no means of knowing what to cast each Widget in the array to.
If some one knows void pointer syntax that would be helpful. As I
understand it there is a type called size_t that takes the
address of as a a value. Can I make an array of these and simply
initialize each with &button1, &cursor, etc? Also, how is size_t
freed?
More information about the Digitalmars-d-learn
mailing list