nested class inheritance
Timon Gehr
timon.gehr at gmx.ch
Sat Jul 14 17:02:29 PDT 2012
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 <code at benjamin-thaut.de
>> <mailto:code at benjamin-thaut.de>> wrote:
>>
>> Am 14.07.2012 19:21, schrieb kenji hara:
>>
>> 2012/7/15 Benjamin Thaut <code at benjamin-thaut.de
>> <mailto:code at 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);
}
More information about the Digitalmars-d
mailing list