ing@hades.OZ (Ian Gold) (11/25/89)
I would like to write object orientated code in C++ but am having trouble coping with two concepts. Perhaps my C background is plaguing me. Perhaps I am a hypocondriac. The first problem is the "#define syndrome". Assume I have a keyboard defined as enum keys { ENTER = 0x13, ESC = 0x27, A_CHR = 0x41, B_CHR = 0x42, . . . }; In C I would declare this globally so everybody knows about it. What I would like to do in C++ is something like class keys { public: enum keys { ENTER = 0x13 . . . }; }; class program : keys { public: void program :: function(void) { return keys::ENTER; } } and allow it to be inherited only by the classes that need it. I realise that this is much slower than using #defines and would only be useful if one uses multiple inheritance. The problem is that the above example is NOT C++. DOES ANYBODY KNOW HOW OR IF I CAN ACHIEVE THE ABOVE IDEAS EFFICIENTY IN C++ ! Is the following code the best way out. class keys { public: int ENTER() { return 0x13; } . . . }; class program : keys { public: void program :: function(void) { return keys::ENTER(); } } My second problem is that of devices. Say I have three CPU's 2 keyboards and half a VDU. Somewhere I must declare these as being the only devices avaliable. IS THE FOLLOWING CODE THE "CORRECT" WAY TO HANDLE THE SITUATION. class program { CPU cpu1; CPU cpu2; CPU cpu3; KEYBOARD keyboard1; KEYBOARD keyboard2; VCU vdu(0.5); boolean program(); public: go() { keyboard1.reset(); keyboard2.reset(); vdu.reset(); program(); } }; void main(void) { program a; a.go(); }
pcg@emerald.cs.aber.ac.uk (Piercarlo Grandi) (11/28/89)
In article <478@hades.OZ> ing@hades.OZ (Ian Gold) writes: The first problem is the "#define syndrome". Assume I have a keyboard defined as enum keys { ENTER = 0x13, ESC = 0x27, A_CHR = 0x41, B_CHR = 0x42, . . . }; In C I would declare this globally so everybody knows about it. What I would like to do in C++ is something like class keys { public: enum keys { ENTER = 0x13 . . . }; }; class program : keys { public: void program :: function(void) { return keys::ENTER; } } and allow it to be inherited only by the classes that need it. The problem is that the above example is NOT C++. Actually it is C++ 2.0; in C++ 1.2 etc... you can instead use static consts, in some compilers at least [in 1.2 you cannot initialize a class static, but a const often can...]. I realise that this is much slower than using #defines and would only be useful if one uses multiple inheritance. Without discussing this, neither assertion is necessarily true. Use enums, not #defines, in C++ 2.0. My second problem is that of devices. Say I have three CPU's 2 keyboards and half a VDU. Somewhere I must declare these as being the only devices avaliable. IS THE FOLLOWING CODE THE "CORRECT" WAY TO HANDLE THE SITUATION. class program { CPU cpu1; CPU cpu2; CPU cpu3; KEYBOARD keyboard1; KEYBOARD keyboard2; VCU vdu(0.5); boolean program(); public: go() { keyboard1.reset(); keyboard2.reset(); vdu.reset(); program(); } }; This is debatable. Function/control decomposition need not be mapped onto data abstraction. This may well be excessive application of Object Orientedness. -- Piercarlo "Peter" Grandi | ARPA: pcg%cs.aber.ac.uk@nsfnet-relay.ac.uk Dept of CS, UCW Aberystwyth | UUCP: ...!mcvax!ukc!aber-cs!pcg Penglais, Aberystwyth SY23 3BZ, UK | INET: pcg@cs.aber.ac.uk
rae%alias@csri.utoronto.ca (Reid Ellis) (11/29/89)
ing@hades.OZ (Ian Gold) writes: |would like to do in C++ is something like | | class keys | { | public: | enum keys { ENTER = 0x13 | . | . | . | }; | }; | | class program : keys | { | public: | void program :: function(void) { return keys::ENTER; } | } | |and allow it to be inherited only by the classes that need it. This is one of the first things I tried to do in C++ too, but I did this instead: class keys { public: const ENTER = 0x13; // ... }; class program : keys { public: int function(void) { return ENTER; } // ... } But I was rewarded with a "not yet implemented" error message :-/ I would hope that static const's are now "implemented" with cfront 2.0. Reid [btw, I found your syntax for the "program" class method 'function' a bit cryptic -- hope I didn't misread what you wanted here.] --- Reid Ellis, 264 Broadway Avenue, Toronto ON, M4P 1V9, Canada rae%alias@csri.utoronto.ca +1 416 487 1383