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

C++ for the MFE class at UC Berkeley Session #2 Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA [email protected] (408) 884 5965

  • View
    218

  • Download
    2

Embed Size (px)

Citation preview

C++ for the MFE class at UC Berkeley

Session #2

Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA

[email protected]

(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 Functionsclass 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;};

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;};

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...

4

Pointer to a class

void PrintDogsAge( Dog * P ){ printf("The age of the ” “Dog is: %d \n", P->GetAge(); }

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();}Exercise: Write the output of this program

5

Virtualclass 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;};

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"; }

};

int main(){ Mammal *pDog = new Dog; pDog->Move(); pDog->Speak();}

Mammal constructor...Dog Constructor...Mammal move one stepWoof!

Dog Fido; Fido.Move(); Fido.Speak();

Mammal constructor...Dog Constructor...Dog moves 5 stepsWoof!Dog destructorMammal 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 variablesclass 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;};

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; }}

There are 5 cats left!Deleting the one which is 0 years oldThere are 4 cats left!Deleting the one which is 1 years oldThere are 3 cats left!Deleting the one which is 2 years oldThere are 2 cats left!Deleting the one which is 3 years oldThere are 1 cats left!Deleting the one which is 4 years old

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:

• More examples

• MFC classes – CString etc…

• Writing Windows application using CDialog

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…

11

MFC – Microsoft Foundation Classes

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

class CAboutDlg : public CDialog{public:

CAboutDlg();enum { IDD = IDD_ABOUTBOX }; // Dialog Data

protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV

support// Implementationprotected:

DECLARE_MESSAGE_MAP()};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}

void CAboutDlg::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()

Implementing CDialog

27

void Capp1Dlg::OnSysCommand(UINT nID, LPARAM lParam){

if ((nID & 0xFFF0) == IDM_ABOUTBOX){

CAboutDlg dlgAbout;dlgAbout.DoModal();

}else{

CDialog::OnSysCommand(nID, lParam);}

}

28

Next week:

• More examples• More MFC classes – CFile etc…• Windows application - Part 2

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…