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