Resizing array of classes

Artur Skawina art.08.09 at gmail.com
Fri Oct 19 03:02:33 PDT 2012


On 10/19/12 11:09, m0rph wrote:
> Suppose I have a dynamic array of classes, something like:
> 
> class Foo {
>     int value;
> }
> 
> Foo[] a;
> 
> Now I want to resize it and initialize new items with default values, so I do following:
> 
> a.length = 10;
> a[0].value = 1;
> 
> And by executing the last line of code I've got a segmentation fault. Apparently a.length = 10 resizes array and creates 10 references to Foo, but objects of Foo were not created. Do I need to manually iterate over new items of the array and explicitly call a[i] = new Foo, or there is a better (automatic) way?

Having it done implicitly by the language would be bad, but it's easy enough
to automate: 

   struct ObjArr(T, alias TF) {
      T[] array;
      alias array this;
      @property:
      auto length() { return array.length; }
      auto length(size_t l) {
         auto old = array.length;
         array.length = l;
         for(; old<l; ++old)
            array[old] = TF();
         return l;
      }
   }

   class Foo {
      int value;
   }

   void main() {
      ObjArr!(Foo, function { return new Foo; }) a;
      a.length = 10;
      a[0].value = 1;
      
      // And if you think the above declaration is too verbose:
      alias ObjArr!(Foo, function { return new Foo; }) FooArr;
      // then:

      FooArr b;
      b.length = 10;
      b[0].value = 1;
   }

etc

artur


More information about the Digitalmars-d-learn mailing list