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);
}

Reply via email to