Oddity when inheriting Gmp.mpz

Chris Angelico <[email protected]>
Newsgroups gmane.comp.lang.pike.user
Message-ID <CAPTjJmpKBQwXgS_1fMf3rRrvV6D2u+NWKzq67C0+VcnxAh4jPg@mail.gmail.com>
Test case:

string format_time(int t) {return
sprintf("%02d:%02d:%02d",t/3600,(t/60)%60,t%60);}

class Time1
{
    inherit Gmp.mpz;
    string _sprintf(int type,mapping|void params) {int
val=(int)mpz::this; write("-- %d\n",val); return type=='O' ?
format_time(val) : ::_sprintf(type,params);}
}

class Time2
{
    inherit Gmp.mpz;
    string _sprintf(int type,mapping|void params) {int
val=(int)mpz::this; write("-- %d\n",val); return type=='O' ?
(string)val : ::_sprintf(type,params);}
}

int main()
{
    write("Bad: %O\n",Time1(1234));
    write("Good: %O\n",Time2(1234));
}

I asked about this a while ago, and was advised to clean out heaps of
my code and replace it with simple inheritance from Gmp.mpz. This
works nicely in a simple case, but fails if I'm calling a function.

Am I going about this wrongly? All I need to do is retrieve the actual
integer stored in the current object, but simply (int)this isn't
working ("no cast method in object"). Using (int)mpz::this does give
correct results, but only as long as I don't pass it to another
function. (In the actual code, format_time() is a bit more
complicated, so simply inlining the sprintf into the time class isn't
ideal.)

It may be an over-eager optimization, but it's also likely that I'm
completely misunderstanding something here.

ChrisA
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.