/* Wirtualny konstruktor kopiujący*/ #include using

Transkrypt

/* Wirtualny konstruktor kopiujący*/ #include using
/* Wirtualny konstruktor kopiujący*/
#include<iostream>
using namespace std;
class Ssak
{
public:
Ssak(int w):waga(w)
{cout<<"Konstruktor klasy Ssak...\n";
}
Ssak (Ssak& ref);
virtual void Glos(){cout<<"Glos ssaka\n";}
virtual Ssak* Klonuj()
{return new Ssak(*this);}
int Ile_wazy()
{return this->waga;}
protected:
int waga;
};
Ssak::Ssak(Ssak& ref):waga(ref.Ile_wazy())
{cout << "Konstruktor kopiujacy klasy Ssak...\n";}
1
class Pies : public Ssak
{
public:
Pies():Ssak(10)
{cout<<"Konstruktor klasy Pies...\n";}
Pies(Pies & ref);
virtual Ssak* Klonuj()
{return new Pies(*this);}
void Glos(){cout<<"Hau\n";}
};
Pies::Pies(Pies& ref):Ssak(ref)
{cout<<"Konstruktor kopiujacy klasy Pies...\n";}
class Kot : public Ssak
{
public:
Kot():Ssak(2)
{cout<<"Konstruktor klasy Kot...\n";}
Kot (Kot& ref);
virtual Ssak* Klonuj()
{return new Kot(*this);}
void Glos(){cout<<"Miau\n";}
};
2
Kot::Kot(Kot& ref):Ssak(ref)
{cout<<"Konstruktor kopiujacy klasy Kot...\n";}
enum ZWIERZAKI {SSAK, KOT, PIES};
void main()
{
Ssak *tablica [3];
Ssak* ptr;
int wybor;
for (int i = 0; i < 3; i++)
{
cout<<"(1)pies
(2)kot (3)ssak : ";
cin>>wybor;
switch (wybor)
{
case PIES: ptr = new Pies;
break;
case KOT: ptr = new Kot;
break;
default: ptr = new Ssak(1);
break;
}
3
tablica[i]=ptr;
}
Ssak *tablica1[3];
for
{
(int i = 0; i < 3 ; i++)
tablica[i]->Glos();
tablica1[i]=tablica[i]->Klonuj();
}
cout<<"Po sklonowaniu :\n\n";
for (int i = 0; i < 3; i++)
{
cout<<"tablica1["<<i<<"]\n";
tablica1[i]->Glos();
cout<<"Waga : "<<tablica1[i]->Ile_wazy()<<endl;
}
system("pause");
}
4
(1)pies (2)kot (3)ssak : 1
Konstruktor klasy Ssak...
Konstruktor klasy Kot...
(1)pies (2)kot (3)ssak : 2
Konstruktor klasy Ssak...
Konstruktor klasy Pies...
(1)pies (2)kot (3)ssak : 3
Konstruktor klasy Ssak...
Miau
Konstruktor kopiujacy klasy
Konstruktor kopiujacy klasy
Hau
Konstruktor kopiujacy klasy
Konstruktor kopiujacy klasy
Glos ssaka
Konstruktor kopiujacy klasy
Ssak...
Kot...
Ssak...
Pies...
Ssak...
5
Po sklonowaniu :
tablica1[0]
Miau
Waga : 2
tablica1[1]
Hau
Waga : 10
tablica1[2]
Glos ssaka
Waga : 1
Press any key to continue . . .
6
// Użycie static_cast i dynamic_cast
#include <iostream>
using namespace std;
class Zwierze
{
public:
virtual void Glos() = 0;
};
class Pies : public Zwierze
{
public:
void Aktywnosc(){cout<<"Pies : Macham ogonem
!!"<<endl;}
void Glos(){cout<<"Pies : Hau hau !!"<<endl;}
};
7
class Kot : public Zwierze
{
public:
void Aktywnosc(){cout<<"Kot : Zlapalem mysz
!!"<<endl;}
void Glos(){cout<<"Kot : Miau miau !!"<<endl;}
};
void ID(Zwierze* pZwierze);
void main()
{
Zwierze* pZwierze1 = new Pies;
Zwierze* pZwierze2 = new Kot;
ID(pZwierze1);
pZwierze1->Glos();
//pZwierze1->Aktywnosc();
ID(pZwierze2);
pZwierze2->Glos();
//pZwierze2->Aktywnosc();
system("pause");
}
8
void ID(Zwierze* pZwierze)
{
Pies* pPies = static_cast<Pies*>(pZwierze);
if(pPies)
{
cout<<"Zwierze to pies"<<endl;
pPies->Glos();
pPies->Aktywnosc();
}
Kot* pKot = dynamic_cast<Kot*>(pZwierze);
if(pKot)
{cout<<"Zwierze to kot"<<endl;
pKot->Glos();
pKot->Aktywnosc();
}
}
9
Zwierze to pies
Pies : Hau hau !!
Pies : Macham ogonem !!
Pies : Hau hau !!
Zwierze to pies
Kot : Miau miau !!
Pies : Macham ogonem !!
Zwierze to kot
Kot : Miau miau !!
Kot : Zlapalem mysz !!
Kot : Miau miau !!
Press any key to continue . . .
10
// Użycie reinterpret_cast static_cast dynamic_cast
#include <iostream>
using namespace std;
class Zwierze
{
public:
virtual void Aktywnosc() = 0;
};
class Pies : public Zwierze
{
public:
void Aktywnosc(){cout<<"Pies : Macham ogonem
!!"<<endl;}
};
class Kot : public Zwierze
{
public:
void Aktywnosc(){cout<<"Kot : Zlapalem mysz !!"<<endl;}
11
};
void main()
{
Zwierze* Podworko[8];
Podworko[0] = new Pies;
Podworko[1] = new Kot;
cout<<"Elementy pierwotne :\n";
Podworko[0]->Aktywnosc();
Podworko[1]->Aktywnosc();
Podworko[2]=reinterpret_cast<Pies*>(Podworko[1]);
Podworko[3]=reinterpret_cast<Kot*>(Podworko[0]);
cout<<"reinterpret_cast :\nBylem kotem\n";
Podworko[2]->Aktywnosc();
cout<<"Bylem psem\n";
Podworko[3]->Aktywnosc();
Podworko[4]=static_cast<Pies*>(Podworko[1]);
Podworko[5]=static_cast<Kot*>(Podworko[0]);
cout<<"static_cast :\nBylem kotem\n";
Podworko[4]->Aktywnosc();
cout<<"Bylem psem\n";
Podworko[5]->Aktywnosc();
12
/*Podworko[6]=dynamic_cast<Pies*>(Podworko[1]);
Podworko[7]=dynamic_cast<Kot*>(Podworko[0]);
cout<<"dynamic_cast :\nBylem kotem\n";
Podworko[6]->Aktywnosc();
cout<<"Bylem psem\n";
Podworko[7]->Aktywnosc();
program się kompiluje, ale pada przy wykonaniu*/
system("pause");
}
13
Elementy pierwotne :
Pies : Macham ogonem !!
Kot : Zlapalem mysz !!
reinterpret_cast :
Bylem kotem
Kot : Zlapalem mysz !!
Bylem psem
Pies : Macham ogonem !!
static_cast :
Bylem kotem
Kot : Zlapalem mysz !!
Bylem psem
Pies : Macham ogonem !!
Press any key to continue . . .
14
// Użycie reinterpret_cast static_cast i dynamic_cast
#include <iostream>
using namespace std;
class Pies
{
public:
void Aktywnosc(){cout<<"Pies : Macham ogonem !!"<<endl;}
};
class Kot
{
public:
void Aktywnosc(){cout<<"Kot : Zlapalem mysz !!"<<endl;}
};
void main()
{
Pies* psy[4];
Kot* koty[4];
15
psy[0] = new Pies;
koty[0] = new Kot;
cout<<"Elementy pierwotne :\n";
psy[0]->Aktywnosc();
koty[0]->Aktywnosc();
psy[1]=reinterpret_cast<Pies*>(koty[0]);
koty[1]=reinterpret_cast<Kot*>(psy[0]);
cout<<"reinterpret_cast :\nBylem kotem\n";
psy[1]->Aktywnosc();
cout<<"Bylem psem\n";
koty[1]->Aktywnosc();
/*psy[2]=static_cast<Pies*>(koty[0]);
koty[2]=static_cast<Kot*>(psy[0]);
cout<<"static_cast :\nBylem kotem\n";
psy[2]->Aktywnosc();
cout<<"Bylem psem\n";
koty[2]->Aktywnosc();
psy[3]=dynamic_cast<Pies*>(koty[0]);
koty[3]=dynamic_cast<Kot*>(psy[0]);
cout<<"dynamic_cast :\nBylem kotem\n";
psy[3]->Aktywnosc();
cout<<"Bylem psem\n";
16
koty[3]->Aktywnosc();
Pies Azor=reinterpret_cast<Pies>(*koty[0]);*/
Pies& Reks=reinterpret_cast<Pies&>(*koty[0]);
cout<<"reinterpret_cast referencja do obiektu
:\nBylem kotem\n";
Reks.Aktywnosc();
system("pause");
}
Elementy pierwotne :
Pies : Macham ogonem !!
Kot : Zlapalem mysz !!
reinterpret_cast :
Bylem kotem
Pies : Macham ogonem !!
Bylem psem
Kot : Zlapalem mysz !!
reinterpret_cast referencja do
obiektu :
Bylem kotem
Pies : Macham ogonem !!
Press any key to continue . . .
17
1>e:\praca\dydaktyka\programowanie obiektowe\visual project\wykład
2016\w_10_09\w_10_09\w_10_09.cpp(33) : error C2440: 'static_cast' : cannot
convert from 'Kot *' to 'Pies *'
1>
Types pointed to are unrelated; conversion requires reinterpret_cast,
C-style cast or function-style cast
1>e:\praca\dydaktyka\programowanie obiektowe\visual project\wykład
2016\w_10_09\w_10_09\w_10_09.cpp(34) : error C2440: 'static_cast' : cannot
convert from 'Pies *' to 'Kot *'
1>
Types pointed to are unrelated; conversion requires reinterpret_cast,
C-style cast or function-style cast
1>e:\praca\dydaktyka\programowanie obiektowe\visual project\wykład
2016\w_10_09\w_10_09\w_10_09.cpp(39) : error C2683: 'dynamic_cast' : 'Kot' is
not a polymorphic type
1>
e:\praca\dydaktyka\programowanie obiektowe\visual project\wykład
2016\w_10_09\w_10_09\w_10_09.cpp(13) : see declaration of 'Kot'
1>e:\praca\dydaktyka\programowanie obiektowe\visual project\wykład
2016\w_10_09\w_10_09\w_10_09.cpp(40) : error C2683: 'dynamic_cast' : 'Pies' is
not a polymorphic type
1>
e:\praca\dydaktyka\programowanie obiektowe\visual project\wykład
2016\w_10_09\w_10_09\w_10_09.cpp(7) : see declaration of 'Pies'
1>e:\praca\dydaktyka\programowanie obiektowe\visual project\wykład
2016\w_10_09\w_10_09\w_10_09.cpp(46) : error C2440: 'reinterpret_cast' : cannot
convert from 'Kot' to 'Pies'
1>
Conversion requires a constructor or user-defined-conversion operator,
which can't be used by const_cast or reinterpret_cast
1>Build log was saved at "file://e:\Praca\Dydaktyka\Programowanie
obiektowe\Visual Project\Wykład 2016\W_10_09\W_10_09\Debug\BuildLog.htm"
1>W_10_09 - 5 error(s), 0 warning(s)
18
Standardowa biblioteka wzorców (STL)
Zestaw klas i funkcji wzorcowych dostarczających:
1. Kontenerów do przechowywania informacji
2. Iteratorów służących do
przechowywanych informacji
uzyskiwania
3. Algorytmów pozwalających
znajdującą się w kontenerach
na
dostępu
manipulowanie
do
treścią
Kontenery STL:
- sekwencyjne (przechowują dane sekwencyjnie – podobnie jak
tablice czy listy – krótki czas wstawiania, długi wyszukiwania)
- asocjacyjne (dane w postaci posortowanej – dłuższy czas
wstawiania, krótszy wyszukiwania)
19
Kontenery sekwencyjne
std::vector
Szybkie wstawianie
elementu na końcu,
dostęp podobny do
tablicy
Zmiana wielkości
może skutkować
spadkiem wydajności,
czas wyszukiwania
proporcjonalny do
liczby elementów
std::deque
Jak vector,
możliwość wstawiania
elementów na
początku
Nie wymaga funkcji
reserve () –
rezerwacja pamięci
std::list
Stały czas
wstawiania na końcu
i w środku listy,
czas usuwania
niezależny od
położenia elementu
Brak swobodnego
dostępu do do
elementów na
podstawie ich
indeksu
20
Kontenery asocjacyjne:
std::set, std::multiset,
std::map,
wartość)
std::multimap
(pary
klucz-
Podstawowe algorytmy STL:
std::find
std::find_if – wyszukanie wartości
std::reverse – odwrócenie kolejności
std::remove_if – usunięcie
std::transform - przekształcenie
21
Klasa STL string
Służy do pracy z ciągami tekstowymi. Ułatwia:
¾Kopiowanie
¾Łączenie ciągów
¾Wyszukiwanie znaków i podciągów tekstowych
¾Skracanie
¾Odwracanie zawartości ciągu tekstowego
22
// Ustanawianie i kopiowanie obiektów klasy string
#include<string>
#include<iostream>
using namespace std;
int main()
{
const string lancuch_1("ABCDEFGHIJKLMNOP");
char* lancuch_2 ="ABCDEFGHIJKLMNOP" ;
//string lancuch_3=const_cast<string>(lancuch_1);
string lancuch_3=lancuch_2;
lancuch_3+="QRST";
cout<<"lancuch_3 : "<<lancuch_3<<endl;
string kopia_1 (lancuch_1);
string kopia_2 (lancuch_2);
cout<<"kopia 1 : "<<kopia_1<<endl;
cout<<"kopia 2 : "<<kopia_2<<endl;
string kopia_3(lancuch_3,6);
cout <<"kopia 3 : " << kopia_3 <<endl;
string kopia_3_1(lancuch_1,0,6);
cout <<"kopia 3_1 : " << kopia_3 <<endl;
23
string kopia_4(lancuch_1,4,6);
cout <<"kopia 4 : " << kopia_4 <<endl;
string kopia_5(lancuch_2,6);
cout <<"kopia 5 : " << kopia_5 <<endl;
string kopia_6(lancuch_1,4,6);
cout <<"kopia 6 : " << kopia_6 <<endl;
//Inicjalizacja obiektu z 4 znakami X
string lancuch_4(4, 'X');
cout <<"lancuch_4 :" << lancuch_4 <<endl;
system("pause");
}
24
lancuch_3
kopia 1 :
kopia 2 :
kopia 3 :
kopia 3_1
kopia 4 :
kopia 5 :
kopia 6 :
lancuch_4
Press any
: ABCDEFGHIJKLMNOPQRST
ABCDEFGHIJKLMNOP
ABCDEFGHIJKLMNOP
GHIJKLMNOPQRST
: GHIJKLMNOPQRST
EFGHIJ
ABCDEF
EFGHIJ
:XXXX
key to continue . . .
25
// Dostęp do elementów składowych obiektu STL string
#include<string>
#include<iostream>
using namespace std;
void main()
{
string lancuch_1("abcdefghijkl");
cout <<"Wyswietlenie zawartosci za pomoca tablicy :"
<<endl;
for (int k = 0;
k < lancuch_1.length();
++ k)
{
cout <<"Znak [" << k <<"] to: ";
cout << lancuch_1[k] <<endl;
}
cout <<endl;
26
//Dostęp do ciągu za pomocą iteratorów
cout <<"Wyswietlenie znakow za pomoca iteratorow :"
<<endl;
int i = 0;
string::iterator iter;
for (iter = lancuch_1.begin()
; iter != lancuch_1.end();
++ iter)
{
cout <<"Znak [" << i ++ <<"] to: ";
cout << *iter <<endl;
}
cout <<endl;
// Dostęp do zawartości jak do ciągu w stylu C
cout << "Reprezentacja char* ciagu to : ";
cout << lancuch_1.c_str() <<endl;
system("pause");
}
27
Wyswietlenie zawartosci za
pomoca tablicy :
Znak [0] to: a
Znak [1] to: b
Znak [2] to: c
Znak [3] to: d
Znak [4] to: e
Znak [5] to: f
Znak [6] to: g
Znak [7] to: h
Znak [8] to: i
Znak [9] to: j
Znak [10] to: k
Znak [11] to: l
Wyswietlenie znakow za pomoca
iteratorow :
Znak [0] to: a
Znak [1] to: b
Znak [2] to: c
Znak [3] to: d
Znak [4] to: e
Znak [5] to: f
Znak [6] to: g
Znak [7] to: h
Znak [8] to: i
Znak [9] to: j
Znak [10] to: k
Znak [11] to: l
Reprezentacja char* ciagu to :
abcdefghijkl
Press any key to continue . . .
28
// Łączenie ciągów tekstowych
#include<string>
#include<iostream>
using namespace std;
void main()
{
string przyklad_1 ("Przyklad 1");
string przyklad_2 (" i drugi.");
//Łączenie
przyklad_1 += przyklad_2;
cout << przyklad_1 << endl;
string przyklad_3 (" Mozna dodac trzeci !");
przyklad_1.append (przyklad_3);
cout << przyklad_1 << endl;
char* wskaznik = " Wskaznik tez mozna dodac !";
przyklad_1.append(wskaznik);
cout << przyklad_1 << endl;
system("pause");
}
29
Przyklad 1 i drugi.
Przyklad 1 i drugi. Mozna dodac trzeci !
Przyklad 1 i drugi. Mozna dodac trzeci ! Wskaznik tez mozna
dodac !
Press any key to continue . . .
30
// Iterator
#include<iostream>
#include<string>
using namespace std;
void main()
{
int k;
string lancuch="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string::iterator iter=lancuch.begin();
cout<<"Poczatek lancucha to : "<<*iter;
cout<<"\nJedziemy w prawo o ";
cin>>k;
iter+=k;
cout<<"pozycji i jestesmy w "<<*iter<<endl;
iter=lancuch.end()-1;
cout<<"Koniec lancucha to : "<<*iter;
cout<<"\nJedziemy w lewo o ";
cin>>k;
iter-=k;
cout<<"pozycji i jestesmy w "<<*iter<<endl;
system("pause");
}
31
Poczatek lancucha to : A
Jedziemy w prawo o 10
pozycji i jestesmy w K
Koniec lancucha to : Z
Jedziemy w lewo o 12
pozycji i jestesmy w N
Press any key to continue . . .
32
// Użycie std::find
#include<string>
#include<iostream>
using namespace std;
void main()
{
string lancuch ("abcd efgh ijkl mnop rst abcdefgh ");
cout << "Przykladowy ciag tekstowy to:" << endl;
cout << lancuch <<endl << endl;
size_t pozycja = lancuch.find ("efgh",0);
if (pozycja != string::npos)
//npos przyjmuje wartosc -1
cout <<"Pierwsze wystapienie 'efgh' nastapilo w
pozycji "
<< pozycja;
else
cout <<"Nie znaleziono slowa 'efgh'";
cout << endl <<endl;
33
// Lokalizacja wszystkich wystapien
size_t pozycja_1 = lancuch.find("abcd", 0);
while (pozycja_1 != string::npos)
{cout <<"Slowo abcd znaleziono w polozeniu "
<< pozycja_1<<endl;
//Funkcja find wyszukuje dalej
size_t pozycja_2 = pozycja_1 +1;
pozycja_1 = lancuch.find("abcd", pozycja_2);
}
cout <<endl;
system("pause");
}
Przykladowy ciag tekstowy to:
abcd efgh ijkl mnop rst abcdefgh
Pierwsze wystapienie 'efgh' nastapilo w pozycji 5
Slowo abcd znaleziono w polozeniu 0
Slowo abcd znaleziono w polozeniu 24
Press any key to continue . . .
34
// Dzialania na zawartosci ciągu tekstowego
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
void main()
{
string lancuch
("abcdefghijklmnoqprstuvwxyzABCEEFGHIJKLMNOPQRSTUVWXYZ0123456789"
);
cout << "Poczatkowa wartosc ciagu to: " <<endl;
cout << lancuch <<endl<<endl;
//Odwracanie ciagu tekstowego
string lancuch_1(lancuch);
reverse(lancuch.begin(),lancuch.end());
cout<<"Ciag odwrocony :"<<endl;
cout << lancuch <<endl<<endl;
//Usuniecie 10 znaków od 15
cout << "10 znakow od 15 zostalo usunietych" <<endl;
lancuch_1.erase(14,10);
35
cout <<lancuch_1<<endl<<endl;
// Usuniecie P
cout <<"Usuniecie P"<<endl<<endl;
string::iterator iter =
find(lancuch.begin(),lancuch.end(),'P');
if(iter != lancuch.end())
lancuch.erase(iter);
cout <<lancuch <<endl<<endl;
//Usuniecie znakow za pomoca przeciazonej wersji erase()
cout<<"Usuniecie zakresu znakow od begin do end"<<endl<<endl;
lancuch.erase(lancuch.begin(),lancuch.end());
if (lancuch.length() ==0)
cout<<"Ciag tekstowy jest pusty"<<endl;
// Konwersja wiekości znaków
transform(lancuch_1.begin(),lancuch_1.end(),lancuch_1.begin(),
toupper);
cout << "Ciag w ktorym znaki skonwertowano na duze: " <<endl;
cout << lancuch_1 <<endl<<endl;
transform(lancuch_1.begin(),lancuch_1.end(),lancuch_1.begin(),
tolower);
36
cout << "Ciag w ktorym znaki skonwertowano na male: "
<<endl;
cout << lancuch_1 <<lancuch_1<<endl;
system("pause");
}
37
Poczatkowa wartosc ciagu to:
abcdefghijklmnoqprstuvwxyzABCEEFGHIJKLMNOPQRSTUVWXYZ0123456789
Ciag odwrocony :
9876543210ZYXWVUTSRQPONMLKJIHGFEECBAzyxwvutsrpqonmlkjihgfedcba
10 znakow od 15 zostalo usunietych
abcdefghijklmnyzABCEEFGHIJKLMNOPQRSTUVWXYZ0123456789
Usuniecie P
9876543210ZYXWVUTSRQONMLKJIHGFEECBAzyxwvutsrpqonmlkjihgfedcba
Usuniecie zakresu znakow od begin do end
Ciag tekstowy jest pusty
Ciag w ktorym znaki skonwertowano na duze:
ABCDEFGHIJKLMNYZABCEEFGHIJKLMNOPQRSTUVWXYZ0123456789
Ciag w ktorym znaki skonwertowano na male:
abcdefghijklmnyzabceefghijklmnopqrstuvwxyz0123456789abcdefghij
klmnyzabceefghijkl
38
mnopqrstuvwxyz0123456789
Press any key to continue . . .