1 / 28

C++ for the MFE class at UC Berkeley Session #2

C++ for the MFE class at UC Berkeley Session #2. Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA yuli@FinancialSimulations.com (408) 884 5965. Inheritance: d erive one class from another. class Mammal { public: Mammal(); ~Mammal(); int GetAge(); void SetAge(int);

manning
Télécharger la présentation

C++ for the MFE class at UC Berkeley Session #2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C++ for the MFE class at UC BerkeleySession #2 Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA yuli@FinancialSimulations.com (408) 884 5965

  2. Inheritance: derive one class from another class Mammal { public: Mammal(); ~Mammal(); int GetAge(); void SetAge(int); int GetWeight(); void SetWeight(); void Speak(); void Sleep(); protected: int itsAge; int itsWeight; }; enum BREED { SHETLAND, DOBERMAN, LAB }; class Dog : public Mammal { public: Dog(); ~Dog(); BREED GetBreed() const; void SetBreed(BREED); protected: BREED itsBreed; }; void main() { Dog fido; fido.SetAge(3); fido.SetBreed( SHETLAND ); cout << "Fido is " << fido.GetAge() << " years old\n"; }

  3. Inheritance: Overriding Functions class Mammal { public: // constructors Mammal() { cout << "Mammal constructor...\n"; } ~Mammal() { cout << "Mammal destructor...\n"; } void Speak() { cout << "Mammal sound!\n"; } void Sleep() { cout << "shhh. I'm sleeping.\n"; } protected: int itsAge; int itsWeight; }; int main() { Mammal bigAnimal; Dog fido; bigAnimal.Sleep(); bigAnimal.Speak(); fido.Sleep(); fido.Speak(); return 0; } Mammal constructor... Mammal constructor... Dog constructor... Shh. I’m sleeping. Mammal sound! Shh. I’m sleeping. Woof! Dog destructor... Mammal destructor... Mammal destructor... class Dog : public Mammal { public: Dog() { cout << "Dog constructor...\n"; } ~Dog() { cout << "Dog destructor...\n"; } void WagTail() { cout << "Tail wagging...\n"; } void BegForFood() { cout << "Begging for food...\n"; } void Speak() { cout << "Woof!\n"; } private: BREED itsBreed; };

  4. Pointer to a class void main() { Dog *pFido = new Dog; pFido->SetAge( 4 ); PrintDogsAge( pFido ); Dog *pMyDog; pMyDog = pFido; PrintDogsAge( pMyDog ); Dog Barky; Barky.SetAge(3); pMyDog = &Barky; int I = pMyDog->GetAge(); pMyDog = pFido; I = pMyDog->GetAge(); int J = pFido->GetAge(); int K = Barky.GetAge(); } void PrintDogsAge( Dog * P ) { printf("The age of the ” “Dog is: %d \n", P->GetAge(); } Exercise: Write the output of this program

  5. Virtual class Mammal { public: Mammal():itsAge(1) { cout << "Mammal constructor...\n"; } ~Mammal() { cout << "Mammal destructor...\n"; } void Move() { cout << "Mammal move one step\n"; } virtual void Speak() { cout << "Mammal speak!\n"; } protected: int itsAge; }; int main() { Mammal *pDog = new Dog; pDog->Move(); pDog->Speak(); } Mammal constructor... Dog Constructor... Mammal move one step Woof! class Dog : public Mammal { public: Dog() { cout << "Dog Constructor...\n"; } ~Dog() { cout << "Dog destructor...\n"; } void WagTail() { cout << "Wagging Tail...\n"; } void Speak() { cout << "Woof!\n"; } void Move() { cout << "Dog moves 5 steps...\n"; } }; Dog Fido; Fido.Move(); Fido.Speak(); Mammal constructor... Dog Constructor... Dog moves 5 steps Woof! Dog destructor Mammal destructor

  6. Virtual – Why do we need it? For example, you could create many different types of windows, including dialog boxes, scrollable windows, and list boxes, and give them each a virtual draw() method. By creating a pointer to a window and assigning dialog boxes and other derived types to that pointer, you can call draw() without regard to the actual run-time type of the object pointed to. The correct draw() function will be called. Exercise: Write example of three classes: base class (CWindow), and two derivative classes (CListBox and CDialogBox) which implement the function draw differently. And a function that receives a pointer of the type CWindow, and calls the draw function.

  7. Static variables class Cat { public: Cat(int age):itsAge(age) { HowManyCats++; } virtual ~Cat() { HowManyCats--; } virtual int GetAge() { return itsAge; } virtual void SetAge(int age) { itsAge = age; } static int HowManyCats; private: int itsAge; }; There are 5 cats left! Deleting the one which is 0 years old There are 4 cats left! Deleting the one which is 1 years old There are 3 cats left! Deleting the one which is 2 years old There are 2 cats left! Deleting the one which is 3 years old There are 1 cats left! Deleting the one which is 4 years old int Cat::HowManyCats = 0; void main() { const int MaxCats = 5; int i; Cat *CatHouse[MaxCats]; for (i = 0; i<MaxCats; i++) CatHouse[i] = new Cat(i); for (i = 0; i<MaxCats; i++) { cout << "There are " << Cat::HowManyCats << " cats left!\n"; cout << "Deleting the one which is " << CatHouse[i]->GetAge() << " years old\n"; delete CatHouse[i]; CatHouse[i] = 0; } }

  8. Static Function – simple… class Cat { public: … static int GetNumberOfCats() { return HowManyCats; } static int HowManyCats; private: int itsAge; }; int Cat::HowManyCats = 4; void main() { int I = Cat::GetNumberOfCats(); }

  9. Static Function – very complicated… class CBuf { public: int A; void CloseCompresBuf(); static void StaticCloseCompresBuf( void *B ) { ((CBuf *)B)->CloseCompresBuf(); } }; void CBuf::CloseCompressedBuf() { printf("A = %d\n", A ); } typedef *FUNC(void *); FUNC *gFunc; void *gParam; void Set_Timer_Timeout ( FUNC Func, void *Param ) { gFunc = Func; gParam = Param; } void Timer_timeout() { gFunc( gParam ); } void main() { CBuf *Buf1 = new CBuf; Buf1->A = 11; Set_Timer_Timeout( (FUNC *) CBuf::StaticCloseCompresBuf, Buf1 ); Timer_timeout(); // emulate interrupt }

  10. Next week: Exercise / Homework: This was the basic foundation of C++ Spending ONLY 2.5 hours in class is NOT enough to master the foundation… The easiest way to memorize it and get more familiar with it is to – surprisingly simple - COPY all the samples and run them one by one on your PC. And based on this foundation… • More examples • MFC classes – CString etc… • Writing Windows application using CDialog

  11. MFC – Microsoft Foundation Classes

  12. Implementing CDialog class CAboutDlg : public CDialog { public: CAboutDlg(); enum { IDD = IDD_ABOUTBOX };// Dialog Data protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP()

  13. void Capp1Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } }

  14. Next week: Exercise / Homework: This was the basic foundation of C++ Spending ONLY 2.5 hours in class is NOT enough to master the foundation… The easiest way to memorize it and get more familiar with it is to – surprisingly simple - COPY all the samples and run them one by one on your PC. And based on this foundation… • More examples • More MFC classes – CFile etc… • Windows application - Part 2

More Related