diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_c_classes_8cpp-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_c_classes_8cpp-source.html Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,198 @@ + +
+00001 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). +00002 // All rights reserved. +00003 // This component and the accompanying materials are made available +00004 // under the terms of "Eclipse Public License v1.0" +00005 // which accompanies this distribution, and is available +00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". +00007 // +00008 // Initial Contributors: +00009 // Nokia Corporation - initial contribution. +00010 // +00011 // Contributors: +00012 // +00013 // Description: +00014 // +00015 +00016 #include "CommonFramework.h" +00017 +00018 // start of real example +00019 +00020 // #include specific files +00021 +00022 // class with single-phase construction, NewL and NewLC +00023 +00024 class COnePhaser : public CBase { +00025 public: // data +00026 TInt iInt1; // one integer +00027 TInt iInt2; // another integer +00028 public: // functions +00029 // construct/destruct +00030 static COnePhaser* NewL() +00031 { // construct and leave if error +00032 return new (ELeave) COnePhaser; // new COnePhaser, C++ constructor +00033 }; +00034 static COnePhaser* NewLC() +00035 { // construct, leave if error, else push to clean-up stack +00036 COnePhaser* self=COnePhaser::NewL(); // construct +00037 CleanupStack::PushL(self); // push to clean-up stack +00038 return self; // and return new object +00039 }; +00040 // other functions +00041 void Print() +00042 { +00043 _LIT(KFormat1,"COnePhaser {TInt %d, TInt %d}"); +00044 console->Printf(KFormat1, iInt1, iInt2); +00045 } +00046 protected: // functions +00047 // construct +00048 COnePhaser() +00049 { // standard C++ constructor, because it cannot leave +00050 iInt1=3; // set first int to 3 +00051 // iInt2=0; // unnecessary +00052 } +00053 }; +00054 +00055 // class with two-phase construction +00056 +00057 class CTwoPhaser : public CBase { +00058 public: // data +00059 TInt iInt1; // one integer +00060 TInt iInt2; // another integer +00061 RTimer iTimer; // a resource +00062 COnePhaser* iOnePhaser; // another CBase object +00063 public: // functions +00064 // construct/destruct +00065 static CTwoPhaser* NewLC(TInt aInt1) +00066 { // construct and leave on the clean-up stack +00067 CTwoPhaser* self=new (ELeave) CTwoPhaser; // new CTwoPhaser, initialized to binary zeroes +00068 CleanupStack::PushL(self); // push to clean-up stack +00069 self->ConstructL(aInt1); // construct +00070 return self; // return new object +00071 }; +00072 static CTwoPhaser* NewL(TInt aInt1) +00073 { // construct and don't leave on clean-up stack +00074 CTwoPhaser* self=CTwoPhaser::NewLC(aInt1); // construct and leave on clean-up stack +00075 CleanupStack::Pop(); // pop from clean-up stack +00076 return self; // return new object +00077 }; +00078 virtual ~CTwoPhaser() +00079 { +00080 delete iOnePhaser; // just destroy anything we point to +00081 iTimer.Close(); // close timer +00082 } +00083 // other functions +00084 void Print() +00085 { +00086 _LIT(KFormat2,"CTwoPhaser {TInt %d, TInt %d, RTimer, "); +00087 console->Printf(KFormat2, iInt1, iInt2); +00088 iOnePhaser->Print(); +00089 _LIT(KtxtCloseCurly,"}"); +00090 console->Printf(KtxtCloseCurly); +00091 } +00092 protected: // functions +00093 // construct support +00094 void ConstructL(TInt aInt1) +00095 { // do the work involved in construction +00096 iInt1=aInt1; // assign iInt1 from argument +00097 User::LeaveIfError(iTimer.CreateLocal()); // initialize timer +00098 iOnePhaser=COnePhaser::NewL(); // make a new one-phaser +00099 } +00100 }; +00101 +00102 // abstract class derived from CBase +00103 +00104 class CAbstract : public CBase +00105 { +00106 public: // data +00107 CTwoPhaser* iTwoPhaser; // a contained object +00108 public: // functions +00109 void SomeFunction(TInt aInt) +00110 { // request some function +00111 _LIT(KTxtbeginSomeFunction,"beginning to do SomeFunction()\n"); +00112 console->Printf(KTxtbeginSomeFunction); +00113 DoSomeFunction(aInt); // invoke virtual function +00114 _LIT(KTxtfinishSomeFunction,"finished doing SomeFunction()\n"); +00115 console->Printf(KTxtfinishSomeFunction); +00116 } +00117 virtual ~CAbstract() +00118 { +00119 delete iTwoPhaser; +00120 } +00121 protected: +00122 virtual void DoSomeFunction(TInt aInt) const =0; +00123 // implement heart of some function, in derived class +00124 void ConstructL(TInt aInt) +00125 { // second phase of constructor +00126 iTwoPhaser=CTwoPhaser::NewL(aInt); +00127 // construct embedded object +00128 } +00129 }; +00130 +00131 // class derived from above +00132 +00133 class CConcrete : public CAbstract +00134 { +00135 public: // data +00136 COnePhaser* iOnePhaser; // some extra data +00137 public: // functions +00138 // construct/destruct +00139 static CConcrete* NewLC(TInt aInt) +00140 { // construct and leave on the clean-up stack +00141 CConcrete* self=new (ELeave) CConcrete; // new object, C++ constructor +00142 CleanupStack::PushL(self); // push to clean-up stack +00143 self->ConstructL(aInt); // CBase constructor +00144 return self; // return new object +00145 }; +00146 static CConcrete* NewL(TInt aInt) +00147 { // construct and don't leave on clean-up stack +00148 CConcrete* self=CConcrete::NewLC(aInt); // construct and leave on clean-up stack +00149 CleanupStack::Pop(); // pop from clean-up stack +00150 return self; // return new object +00151 }; +00152 virtual ~CConcrete() +00153 { +00154 delete iOnePhaser; // destroy member +00155 } +00156 // protocol +00157 virtual void DoSomeFunction(TInt aInt) const +00158 { // implementation of base class's pure-virtual function +00159 _LIT(KFormat3,"CConcrete::DoSomething(%d)\n"); +00160 console->Printf(KFormat3, aInt); +00161 } +00162 protected: +00163 // construct/destruct +00164 void ConstructL(TInt aInt) +00165 { // second phase of construction +00166 CAbstract::ConstructL(aInt); // base class constructor +00167 iOnePhaser=COnePhaser::NewL(); // contained member constructor +00168 } +00169 }; +00170 +00171 // do the example +00172 LOCAL_C void doExampleL() +00173 { +00174 // two-phase object +00175 CTwoPhaser* twoPhaser=CTwoPhaser::NewLC(5); +00176 // new two-phase object +00177 twoPhaser->Print(); // print it +00178 _LIT(KTxtNewLine,"\n"); +00179 console->Printf(KTxtNewLine); // with trailing new-line +00180 CleanupStack::PopAndDestroy(); // two-phase object +00181 // concrete instance of an abstract class +00182 CAbstract* abstract=CConcrete::NewLC(9); +00183 // new concrete object, but refer to it with abstract pointer +00184 abstract->SomeFunction(11); // do something with it +00185 CleanupStack::PopAndDestroy(); // abstract object +00186 } +