Xref: utzoo comp.object:507 comp.lang.c++:5679 Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!ucsd!swrinde!cs.utexas.edu!uunet!microsoft!jimad From: jimad@microsoft.UUCP (Jim Adcock) Newsgroups: comp.object,comp.lang.c++ Subject: Re: Dumb question Message-ID: <9191@microsoft.UUCP> Date: 28 Nov 89 17:53:48 GMT References: <61737@aerospace.AERO.ORG> <9938@june.cs.washington.edu> <2122@tukki.jyu.fi> <2159@tukki.jyu.fi> Reply-To: jimad@microsoft.UUCP (Jim Adcock) Organization: Microsoft Corp., Redmond WA Lines: 125 // in any case -- here's a quick and dirty example of what I think // people have been talking about.... #include #include void Fatal() { fprintf(stderr, "Smalltalk-like runtime error\n"); exit(1); } char* base__classname = "base"; class base { public: virtual char* classname() {return base__classname; } virtual int compare(base& b) {if (classname() != b.classname()) Fatal(); else return 0;} virtual base& print() {printf("base\n"); return *this;} friend int operator==(base& a, base& b){return a.compare(b)==0;} friend int operator!=(base& a, base& b){return a.compare(b)!=0;} friend int operator>=(base& a, base& b){return a.compare(b)>=0;} friend int operator<=(base& a, base& b){return a.compare(b)<=0;} friend int operator>(base& a, base& b){return a.compare(b)>0;} friend int operator<(base& a, base& b){return a.compare(b)<0;} }; char* Int__classname = "Int"; class Int : public base { int i; public: Int(int ii) { i = ii; } base& print(){ printf("%d\n",i); return *this;} char* classname() { return Int__classname; } int compare(base& b) {if (b.classname() != classname()) Fatal(); else return i-((Int*)&b)->i; } }; char* Double__classname = "Double"; class Double : public base { double i; public: Double(double ii) { i = ii; } base& print(){ printf("%g\n",i); return *this;} char* classname() { return Double__classname; } int compare(base& b) //this is a slightly bogus def for "compare": { if (b.classname() != classname()) Fatal(); else return (int)(1.0e10*(i-((Double*)&b)->i)); } }; char* String__classname = "String"; class String : public base { char* i; public: String(char* ii) { i = ii; } base& print(){ printf("%s\n",i); return *this;} char* classname() { return String__classname; } int compare(base& b) { if (b.classname() != classname()) Fatal(); else return strcmp(this->i, ((String*)&b)->i); } }; class List4 //cheap imitation of a "real" list class { base* p[4]; public: List4(base* p0, base* p1, base *p2, base *p3) {p[0]=p0; p[1]=p1; p[2]=p2; p[3]=p3;} List4& print(); List4& sort(); }; List4& List4::print() { printf("(\n"); for (int i=0; i<4; ++i) p[i]->print(); printf(")\n"); return *this; } List4& List4::sort() //bogus { for (int j=0; j<3; ++j) for (int i=0; i<3; ++i) if (*p[i] > *p[i+1]) { base* tmp = p[i]; p[i] = p[i+1]; p[i+1] = tmp; } return *this; } main() { Int i6(6); Int i5(5); Int i_100(-100); Int i200(200); Int i5a(5); Double d5(5); Double d6(5); String himom("hi mom"); String hidad("hi dad"); String hibro("hi bro"); String hisis("hi sis"); String hidad2("hi dad"); printf("%d\n", i5 == i5a); printf("%d\n", i5 > i6); printf("%d\n", i5 == i5); printf("%d\n", d5 < d6); printf("%d\n", d5 == d5); printf("%d\n", himom == hidad); printf("%d\n", hidad == hidad2); printf("%d\n", hidad > himom); List4 L1(&himom, &hidad, &hibro, &hisis); L1.print().sort().print(); List4 L2(&i6, &i5, &i_100, &i200); L2.print().sort().print(); printf("%d\n", i5 > himom); //ack! compare of unlike objects! } Brought to you by Super Global Mega Corp .com