On 07/15/2012 12:55 AM, Benjamin Thaut wrote:
Am 14.07.2012 19:30, schrieb Gor Gyolchanyan:
On Sat, Jul 14, 2012 at 9:23 PM, Benjamin Thaut <c...@benjamin-thaut.de
<mailto:c...@benjamin-thaut.de>> wrote:
Am 14.07.2012 19:21, schrieb kenji hara:
2012/7/15 Benjamin Thaut <c...@benjamin-thaut.de
<mailto:c...@benjamin-thaut.de>>:
The only problem about this is:
class Fruit
{
class Seed {
void SetFruit(Fruit fruit)
{
this.outer = fruit;
Setting to pseudo variable 'outer' should be rejected in
compilation.
Please report it to bugzilla.
}
}
}
class Apple: Fruit
{
void AppleOnlyMethod(){ ... }
class AppleSeed: Fruit.Seed {
void DoSomething()
{
AppleOnlyMethod();
}
}
auto GetNewSeed() { return new AppleSeed(); }
}
auto apple = new Apple();
auto seed = apple.GetNewSeed();
seed.SetFruit(new Fruit());
seed.DoSomething(); //what happens here?
Kind Regards
Benjamin Thaut
Kenji Hara
I will not report this, beacuse it will break my custom new operator
(template) for inner classes ;-)
Kind Regards
Benjamin Thaut
That's most unwise, because if it's not supposed to be like that it will
get fixed anyway, so you better start replacing your custom new operator.
--
Bye,
Gor Gyolchanyan.
Replacing my custom new operator exactly by what? Overloading the build
in new is deprecated...
class C{
class D{
}
}
void main(){
auto c = new C;
auto buf = new void[__traits(classInstanceSize, C.D)];
(cast(byte[])buf)[] = typeid(C.D).init[];
auto d = cast(C.D)buf.ptr;
static if(is(typeof(d.__ctor()))) d.__ctor();
enum offset=d.outer.offsetof;
static assert(offset%C.sizeof==0);
(cast(C[])buf)[offset/C.sizeof]=c;
assert(d.outer is c);
}