430 likes | 546 Views
LESSON 18. Overview of Previous Lesson(s). Over View. Inheritance Inheritance is an essential part of OOP It is the process of creating new classes, called derived classes, from existing or base classes.
E N D
Overview of Previous Lesson(s)
Over View • Inheritance • Inheritance is an essential part of OOP • It is the process of creating new classes, called derived classes, from existing or base classes. • The derived class inherits all the capabilities of the base class but can also add its own functionality. • Reusability Extensibility Data hiding Overriding
Over View.. • Access Modifiers: • Public Private Protected • Members of a class that are protected can only be accessed by member functions of the class, and by friend functions of the class.
Over View… • Virtual Functions: • In OOP a virtual function / method is a function / method whose behavior can be overridden within an inheriting class by a function with the same signature. • Virtual functions ensure that the correct function is called for an object, regardless of the expression used to make the function call.
Over View… • Polymorphism • It is anOOP feature that allows values of different data types to be handled using a uniform interface. • The concept of parametric polymorphism applies to both data types and functions.
Over View… • Polymorphism.. • A function that can be applied to values of different types is known as a polymorphic function. • A data type that can appear to be of a generalized type is designated polymorphic data type like the generalized type from which such specializations are made.
Over View… • Polymorphism..
Contents • Debugging • Program Bugs • Common Bugs • Basic Debugging Operations • Setting Breakpoints • Setting Trace points • CLR Programming • Generic Functions • Defining Functions • Using Functions
Debugging • Bugs are the errors in our program. • Debugging is the process of finding and eliminating bugs. • Some facts about bugs: • Almost every program contain bugs that we need to expose, find, and eliminate. • A program bug is not necessarily apparent. • If it is apparent programmer may not know where it is in source code. • Even when a programmer know roughly where it is, it may not be easy to determine what exactly is the root cause and how to eliminate it.
Debugging.. • Many programs contain bugs even after it is fully tested. • Program bugs can remain hidden in a program that is apparently operating correctly. • Programs beyond a certain size and complexity always contain bugs. • Many bugs are eliminated during the compile and link phases, but there are still quite a few left even after an executable module is produced.
Debugging… • There are 4 strategies that can help to make debugging as painless as possible: • Don’t re-invent the wheel. • Library functions. • Develop and test your code incrementally. • Test each significant class and function individually. • Gradually assemble them.
Debugging.. • Code defensively • Declare member functions of native C++ classes that don’t modify an object as const . • Use const parameters. • Define const objects with the required values. • Include debugging code.
Program Bugs • Types of errors in code that result in program bugs: • Syntactic errors • These are errors that result from statements that are not of the correct form. • Ex, Missing semicolon from the end of a statement. • Compiler recognizes all syntactic errors.
Program Bugs.. • Semantic errors • These are errors where the code is syntactically correct, but it does not do what you intended. • The compiler cannot know what you intended to achieve with your program, so it cannot detect semantic errors • Very subtle and difficult to find.
Basic Debugging • Debugger • It is a program that controls the execution of program code in such a way that we can step through the source code one line at a time, or run to a particular point in the program. • At each point in the code where the debugger stops, we can inspect or even change the values of variables before continuing. • Can change the source code, recompile, and then restart the program from the beginning.
Ex Program int main() { long* pnumber(nullptr); // Pointer declaration & initialization long number1 = 55, number2 = 99; pnumber = & number1; // Store address in pointer *pnumber += 11; // Increment number1 by 11 cout<< "number1 = "<< number1<<"&number1="<<hex<< pnumber; pnumber = & number2; // Change pointer to address of number2 number1 = *pnumber*10; // 10 times number2 cout<< "number1="<<dec<< number1<<" pnumber = “<<hex<< pnumber << " *pnumber = " << dec << *pnumber; return 0; }
Debugging Operations • When a program doesn’t behave as it should be: • Debugger facilitates to work through a program one step at a time to find out where and how it is going wrong. • Inspect the state of program’s data at any time during execution. • Basic Configurations for debugging in VS • Build configuration should be set to Win32 Debug. • Build ➪ Configuration Manager . . . menu option.
Debugging Operations.. • The Debug configuration in a project causes additional information to be included in executable program when you compile it. • Debugging facilities can be used by this information. • .pdb file in the Debug folder of project.
Break Points • A breakpoint is a point in our program where the debugger automatically suspends execution when in debugging mode. • Can set multiple break points. • Advantages of breakpoints ??? • How to set a break point. ???
Trace Points • A trace-point is a special kind of breakpoint that has a custom action associated with it. • Can set multiple trace points. • Advantages of tracepoints ??? • How to set a tracepoint. ??? • Can create a tracepoint by right–clicking the line of code where you want the tracepoint to be set and selecting the Breakpoint ➪ Insert Tracepoint menu item from the pop-up.
Trace Points.. • When tracepoint is hit ..
Functions • Function properties for native C++ applies equally well to C++/CLI language. • Exception • Parameter types and return types will be of fundamental types. • The throw and catch mechanism for exceptions works much the same in CLR programs as it does in native C++ programs, but there are some differences. • In CLI exceptions are always thrown using tracking handles
Functions try { throw L"Catch me if you can."; } catch(String^ ex) // The exception will not be caught by this { Console::WriteLine(L"String^: {0}",ex); } • The catch block cannot catch the object. • Because the throw statement throws an exception of type const wchar_t* , not of type String^ .
Functions • To catch the exception as thrown, the catch block needs to be: try { throw L"Catch me if you can."; } catch(const wchar_t* ex) // The exception thrown is of this type { String^ exc = gcnew String(ex); Console::WriteLine(L"wchar_t:{0}", exc); } • This catch block catches the exception because it now has the correct type.
Functions • To throw the exception so that it can be caught by the original catch block: try { throw gcnew String(L"Catch me if you can."); } catch(String^ ex) // OK. Exception thrown is of this type { Console::WriteLine(L"String^: {0}",ex); } • The exception is a String object and is thrown as type String^ , a handle that references the string.
Generic Functions • Appeared same as Function templates. • Calling function template, the compiler generates the source code for each function that we require from the template. • More functions being generated, size of the execution module may be increased substantially.
Generic Functions.. • A generic function specification is itself compiled. • When a call goes to a function that matches the generic function specification, actual types are substituted for the type parameters at execution time. • No extra code is generated at compile time.
Defining Generic Functions A generic function can be defined using type parameters that are replaced by actual types when the function is called. generic < typename T > where T:IComparable T MaxElement(array < T > ^ x) { T max(x[0]); for(inti = 1; i < x- > Length; i++) if(max- > CompareTo(x[i]) < 0) max = x[i]; return max; }
Defining Generic Functions.. generic < typename T > where T:Icomparable The generic keyword identifies what follows as a generic specification. The type parameter for the function as T. the typename keyword indicates that the T that follows is the name of a type parameter in the generic function. For multiple type parameters, the parameter names go between the angled brackets, each preceded by the typename keyword and separated by commas.
Defining Generic Functions… generic < typename T > where T:Icomparable • The where keyword introduces a constraint on the actual type that may be substituted for T . • This constraint says that any type that is to replace T in the generic function must implement the IComparable interface. • IComparable interface: • It implies that the type must define the CompareTo() function that allows two objects of the type to be compared.
Using Generic Functions The simplest way of calling a generic function is just to use it like any ordinary function. array < double > ^ data = {1.5, 3.5, 6.7, 4.2, 2.1}; double maxData = MaxElement(data); The compiler is able to deduce that the type argument to the generic function is double in this instance, and generates the code to call the function accordingly. The function executes with instances of T in the function being replaced by double.
Using Generic Functions.. • It is possible that the compiler may not be able to deduce the type argument from a call of a generic unction. • Specify the type argument(s) explicitly between angled brackets following the function name in the call. double maxData = MaxElement < double > (data); • With an explicit type argument specified, there is no possibility of ambiguity.
Using Generic Functions... • Limitations on supplying type arguments: • Cannot be a native C++ class type. • Cannot be a native pointer or reference, • Cannot be a handle to a value class type such as int^ . • Allowed type arguments are • Only value class types such as int or double. • Tracking handles such as String^ are allowed.
Using Generic Functions... Lets see an example