c++: interface as concept
TRANSCRIPT
‐Recap:C++‐MemoryHandling–OO:interfaceandexamplesofOOLanguages
JussiPohjolainenTAMKUniversityofAppliedSciences
StackBasedMemoryAllocaJon
• RegionofMemory• DataisaddedinLast‐In‐First‐Outmanner– StackallocaJonverysimple,fasterthanheapallocaJon
– ReleasingisautomaJc
– Stacksizeislimitedandusuallysmallerthanheap.• (InSymbianC++,stacksizeisonly8Kb)
StackOverflow
• StackoverflowoccurswhentoomuchmemoryisusedontheStack– Itispossibletochangethestacksize(differsindifferentoperaJngsystems)
• StackoverflowhappensusuallywhenaXempJngtolocalarrayvariablewithverybigsize.
DynamicMemoryAllocaJon
• DynamicmemoryallocaJonistheallocaJonofmemorystorageforuseinacomputerprogramduringtherunJmeofthatprogram.
• DynamicallyallocatedmemoryexistsunJlitisreleased– Stack:fixedduraJon
• HeapMemoryArea
UseofHeap
• WhencontrollinglifeJmeofthevariable• "Big"variables• WhendecidingtheamountofallocatedmemoryinrunJme.
Result?#include <iostream>
using namespace std;
class Cat {
};
int main() { cout << new Cat() << endl;
return 0; }
Result?
int main() { // This is variable, which // is stored in stack-memory Cat* mirri; // Creates the Cat mirri = new Cat(); return 0; }
HowmanyallocaJonstoStackandhowmanytoHeap?
int main() { Cat* mirri1 = new Cat();
Cat* mirri2 = mirri1; return 0; }
Doesthiswork?#include <iostream>
using namespace std;
class Car { public: string brand_; public: Car(string brand) : brand_(brand) { } };
int main() { Car datsun1("datsun"); Car datsun2 = datsun1;
return 0; }
It'sthesamethan...#include <iostream>
using namespace std;
class Car { public: string brand_; public: Car(string brand) : brand_(brand) { } };
int main() { Car datsun1("datsun"); Car datsun2(datsun1);
return 0; }
AndC++makesDefaultCopyConstructor...
#include <iostream>
using namespace std;
class Car { public: string brand_; public: Car(string brand) : brand_(brand) { } Car(const Car& car) : brand_(car.brand_) { } };
int main() { Car datsun1("datsun"); Car datsun2(datsun1);
return 0; }
Andthisisthesame..#include <iostream>
using namespace std;
class Car { public: string brand_; public: Car(string brand) : brand_(brand) { } Car(const Car& car) { brand_ = car.brand_; } };
int main() { Car datsun1("datsun"); Car datsun2 = datsun1;
return 0; }
ComposiJonclass Motor { };
class Car { private: Motor* motor; public: Car() { motor = new Motor(); } ~Car() { delete motor; } };
int main() { Car datsun1();
return 0; }
WithIniJalizaJonListclass Motor { };
class Car { private: Motor* motor; public: Car() : motor(new Motor()) { } ~Car() { delete motor; } };
int main() { Car datsun1();
return 0; }
Whathappensnow?class Motor { };
class Car { private: Motor* motor; public: Car() : motor(new Motor()) { } ~Car() { delete motor; } };
int main() { Car datsun1; Car datsun2 = datsun1;
return 0; }
DefaultCopyConstructorclass Motor { };
class Car { private: Motor* motor; public: Car() : motor(new Motor()) { } Car(const Car& car) { motor = car.motor; } ~Car() { delete motor; } };
int main() { Car datsun1; Car datsun2 = datsun1;
return 0; }
ThisisthesituaJonwhereyouhavetoimplementyourownversionof
thecopyconstructor!(and=operaJonoverload..)
AnyProblemHere?class Motor { };
class Vehicle { };
class Car : public Vehicle {
private: Motor* motor; public: Car() : motor(new Motor()){} ~Car() { delete motor;
} };
int releaseVehicle(Vehicle* v) { delete v; }
int main() {
Car* mycar = new Car(); releaseVehicle(mycar); return 0; }
SoluJonclass Motor { };
class Vehicle { public: virtual ~Vehicle() { } };
class Car : public Vehicle { private: Motor* motor; public:
Car() : motor(new Motor()){} ~Car() { delete motor; } };
int releaseVehicle(Vehicle* v) { delete v; }
int main() {
Car* mycar = new Car(); releaseVehicle(mycar); return 0; }
INTERFACEASCONCEPT
RemoteControl
• Project:RemoteControlledCarSystem• Projectgroup:Pete(RemoteControl)andJack(Car)
InC++class RemoteControl { private: Car* car_; public: RemoteControl(Car* car) { car_ = car; } void keyVolumeUp() { car_->accelerate(); } void keyVolumeDown() { car_->decelerate(); } ... }
WorkFlow
Pete'sresponsibility Jack'sresponsibility
Agreement?WhatarethemethodsinCarthattheRemotecancall?
SoPeteImplementsthis..class RemoteControl { private: Car* car_; public: RemoteControl(Car* car) { car_ = car; } void keyVolumeUp() { car_->accelerate(); } void keyVolumeDown() { car_->decelerate(); } ... }
AndJackImplementsthis..Wehaveaproblem.
class Car { public: void driveFaster() { ... }
void driveSlower() { ... } ... }
MaintananceandReusability?
• PeteandJackmadesaagreementonmethodnamesandhowthetwoobjectsshouldworkwitheachother
• Theprojectwentsowell,thatthecompanygetsanotherorder:– RemotecontrolledAirplane
• Weknowthatwehaveplentyofcodefromthepreviousprojectbutthecodewasnotimplementedreusabilityinmind..
CoulditbepossibletoimplementtheAirplanewithouttouchingtheRemote?
Pete'sresponsibility
Jack'sresponsibility
Agreement,Interface?
• PeteandshouldimplementtheRemotesothatitisreusable.
• TheyshouldmakewithJackagreement(interface)definedalsointhecode.
• Thetargetobjectshouldfollowtheinterfaceandtheremotecontroliscontrollingthetargetobjectviatheinterface
interface
Interface?
• Interface:abstractclasswithonlyabstractmethods.– Classdoesnothaveanyconcretemethods,onlyabstractmethods.
• PeteandJackagreesthattheremotecancontrolanymovableobject,thathasfollowingmethods:– start– accelerate– declerate– stop
ImplemenJngtheInterface
class Movable { public: virtual void start() = 0; virtual void stop() = 0; virtual void accelerate() = 0; virtual void declerate() = 0; };
CarandAirplaneclass Car : public Movable { public: void start() { ... } void stop() { ... } void accelerate() { ... } void declerate() { ... } }
class Airplane : public Movable { public: void start() { ... } void stop() { ... } void accelerate() { ... } void declerate() { ... } }
Remoteclass RemoteControl { private: Movable* movable_; public: RemoteControl(Movable* movable_) { movable_ = movable_; } void keyVolumeUp() { movable_->accelerate(); } void keyVolumeDown() { movable_->decelerate(); } }
Usage
int main() { Car* datsun = new Car(); RemoteControl rc = new RemoteControl(datsun); for(int i=0; i<10; i++) rc->keyVolumeUp(); ... }
Usage
int main() { Airplane* ap = new Airplane(); RemoteControl rc = new RemoteControl(ap); for(int i=0; i<10; i++) rc->keyVolumeUp(); ... }
MulJpleInheritance
class Car : public Movable, public Vehicle { public: void start() { ... } void stop() { ... } void accelerate() { ... } void declerate() { ... } }
Thisdoesnotwork,why?class RemoteControl { private: Vehicle* vehicle_; public: RemoteControl(Vehicle* vehicle) { vehicle_= vehicle; } void keyVolumeUp() { vehicle_->accelerate(); } void keyVolumeDown() { vehicle_->decelerate(); } };
Doesitworknow?
RemoteControlledHuman?
• Wewouldlikethatthesameremotecontrolwouldworkonhumanstoo.
• Isthistheway?
BeXerway
InterfaceinC++
• InterfaceinC++isjustaclassthathasonlyabstractmethods– Couldleadtoproblems,howdoyouseeincodewhatisinterfaceandwhatisconcreteclass?• class Car : public Vehicle, public Movable
• SymbianC++soluJon:namingstandard:– class CCar: public CVehicle, public MMovable
• Java:– class Car extends Vehicle implements Movable
Examples
• OOisusedalmostnowdaysalmostineveryProgramminglanguage!
• Java• PHP• SymbianC++
• ...