On Sun, Jul 15, 2012 at 1:41 PM, Benjamin Thaut <code@benjamin-thaut.de
<mailto:code@benjamin-thaut.de
<mailto:code@benjamin-thaut.de
<mailto:code@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);
}
Yes of course I can assign the reference by computing the address
and then using that to assign it. But the point here is, that this
is currently the only bug that is hepling me in what I'm doing, and
I rather want the 7 other bugs I reported so far to be fixed, rather
then the one that helps me.
Kind Regards
Benjamin Thaut
Not being able to assign is not about some sort of authoritative
forbidding. It's about not breaking a working mechanism. You can't cast
a function pointer into a class object not because the type system says
so (which it does), but because that'll result in an undefined behavior,
which will result in an immediate crash in the best scenario. Go ahead
and change the outer via those hacks. But then don't get surprised when
your program crashes for no reason (because the compiler assumed it not
to change and ended up being wrong).
--
Bye,
Gor Gyolchanyan.