consolidate all repos to one for archive

This commit is contained in:
2025-01-28 13:46:42 +01:00
commit a6610fbc7a
5350 changed files with 2705721 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
#include "Date.h"
std::ostream& operator<<(std::ostream &out, const Date &date) {
return out << date.toString();
}
Date::Date(unsigned int day, unsigned int month, unsigned int year) : day(day), month(month), year(year) {}
std::string Date::toString() const {
return std::to_string(day) + ", " + std::to_string(month) + ", " + std::to_string(year);
}
bool Date::operator==(const Date &other) const {
return this->year == other.year && this->month == other.month && this->day == other.day;
}
//prefix ++a
Date& Date::operator++() {
day++;
if(months[month-1] < day){
month++;
day = 1;
}
if(month == 13){
year++;
month = 1;
}
return *this;
}
//postfix a++
Date Date::operator++(int dummy) {
Date tmp(day,month,year);
day++;
if(months[month-1] < day){
month++;
day = 1;
}
if(month == 13){
year++;
month = 1;
}
return tmp;
}

View File

@@ -0,0 +1,26 @@
#ifndef NALOGA0201_DATE_H
#define NALOGA0201_DATE_H
#include <string>
class Date {
friend std::ostream& operator<<(std::ostream &out, const Date &date);
private:
unsigned int day, month, year;
int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public:
Date() = default;
Date(unsigned int day, unsigned int month, unsigned int year);
~Date() = default;
std::string toString() const;
bool operator==(const Date& other) const;
Date& operator++();//prefix ++a
Date operator++(int dummy);//postfix a++
};
#endif //NALOGA0201_DATE_H

View File

@@ -0,0 +1,35 @@
V nalogi 9.1 ste implementirali pametni kazalec. Vendar pa pri taki implementaciji lahko nastopi naslednja težava:
int main() {
SmartPointer<Date> date1(new Date(6, 5, 2020)); // s pomočjo pametnega kazalca, dinamično ustvarimo objekt Date
{
SmartPointer<Date> date2 = date1; // na tem mestu naredimo kopijo kazalca date1 in sedaj oba kazalca (date1
// in date2 kažeta na isti objekt
} // na tem mestu se bo klical destruktor pametnega kazalca date2 in pobrisal objekt Date
std::cout << date1->toString() << std::endl; // ker sta oba kazalca kazala na isti objekt v pomnilniku,
// se bo tukaj zgodila napaka, saj bomo klicali metodo toString()
// nad objektom, ki več ne obstaja
return 0;
}
Da odpravite to težavo, morate implementirati štetje referenc. Da boste pri pametnem kazalcu podprli štetje referec, sledite naslednjim zahtevam:
Ustvarite razred ReferenceCounter, ki naj ima celoštevilsko lastnost count, ki bo predstavljala števec obstoječih referenc na določen objekt. Lastnost count privzeto nastavite na vrednost 0.
Za povečevanje oz. zmanjševanje števca referenc prekrijte naslednja dva operatorja:
prefixni operator --, ki bo števec referenc zmanjšal za vrednost ena in
postfixni operator ++, ki bo števec referenc povečal za vrednost ena.
V razred SmartPointer dodajte novo lastnost, ki naj bo kazalec na objekt ReferenceCounter. Ta lastnost bo skupna vsem instancam pametnih kazalcev, ki bodo kazali na isti kazalec. V nastavitvenem konstruktorju inicializarjte to vrednost.
Za "vzdrževanje" števca referenc prekritje operator = in implementirajte kopirni konstruktor. Pri tem skopirajte obe lastnosti in števec referenc povečajte za vrednost 1. Pri tem preverite, če slučajno želi nekdo kopirati samega sebe (objekt). Takrat samo vrnete samega sebe in ne kopirate objekta. S tem, ko smo implementirali kopirni konstruktor, prekrili operator in implementirali destruktor, smo upoštevali pravilo rule of three. Tako vam mora v spodnjem primeru kode metoda useCount() vrniti samo 2 referenci.
SmartPointer<Date> date1(new Date(1, 1, 2020));
SmartPointer<Date> date2(new Date(1, 1, 2019));
date2 = date1 = date1 = date1 = date1 = date1;
date2 = date2;
date2 = date2;
std::cout << "reference count: " << date2.useCount() << std::endl;
Popravite še destruktor v razredu SmartPointer, ki bo izbrisal objekt samo v primeru, če je števec referenc enak 0.
Da boste lahko znotraj pametnega kazalca preverili kaka je vrednost števca count, dodajte metodo useCount(), ki vrne števec count.
V glavnem programu demonstrirajte uporabo vašega pametnega kazalca. Naj bo vidno tudi delovanje štetja referenc. Za prikaz delovanja lahko vzamete katerikoli razred iz prejšnjih nalog (npr. razred Date) ali pa napišete novega.

View File

@@ -0,0 +1,21 @@
#ifndef NALOGA0902_REFERENCECOUNTER_H
#define NALOGA0902_REFERENCECOUNTER_H
class ReferenceCounter {
private:
unsigned int count = 0;
public:
unsigned int operator++() {
return ++count;
}
unsigned int operator--() {
return --count;
}
unsigned int useCount() {
return count;
}
};
#endif //NALOGA0902_REFERENCECOUNTER_H

View File

@@ -0,0 +1,60 @@
#ifndef NALOGA0901_SMARTPOINTER_H
#define NALOGA0901_SMARTPOINTER_H
#include "ReferenceCounter.h"
template<typename T>
class SmartPointer {
private:
T *pointer;
ReferenceCounter *used;
public:
SmartPointer() {
used = new ReferenceCounter();
++*used;
}
SmartPointer(T *pointer) : pointer(pointer) {
used = new ReferenceCounter();
++*used;
}
SmartPointer(const SmartPointer<T> &p1) : pointer(p1.pointer), used(p1.used) {
++*used;
}
~SmartPointer() {
if (--*used == 0) {
delete pointer;
delete used;
}
}
T &operator*() {
return *pointer;
}
T *operator->() {
return pointer;
}
SmartPointer<T> &operator=(const SmartPointer<T> &sp) {
if (this != &sp) {
if (--*used == 0) {
delete pointer;
delete used;
}
pointer = sp.pointer;
used = sp.used;
++*used;
}
return *this;
}
unsigned int useCount() {
return used->useCount();
}
};
#endif //NALOGA0901_SMARTPOINTER_H

View File

@@ -0,0 +1,22 @@
#include <iostream>
#include "SmartPointer.h"
#include "Date.h"
int main() {
std::cout << "Hello, World!\n\n";
SmartPointer<Date> date1(new Date(6, 5, 2020));
{
SmartPointer<Date> date2 = date1;
}
std::cout << date1->toString() << std::endl;
SmartPointer<Date> date2(new Date(1, 1, 2019));
date2 = date1 = date1 = date1 = date1 = date1;
date2 = date2;
date2 = date2;
std::cout << "reference count: " << date2.useCount() << std::endl;
return 0;
}