Run Code
|
API
|
Code Wall
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
cv5
#include <iostream> using std::cout; using std::endl; //typedef int TType; // C retro :-( ///----- CVector.h zacatek using TType = double; // C++ modern :-) class CVector { size_t iSize;// = 0; size_t iCapacity;// = 0; TType *iData;// = nullptr; const size_t iID; static size_t iTotalCounter; // Toto neni definice to je deklarace static size_t iLivingCounter; // Toto neni definice to je deklarace public: // default c'tor CVector(): iSize(0), iCapacity(0), iData(nullptr), iID(iTotalCounter++) { cout << "default c'tor #" << iID << '\n'; ++iLivingCounter; } // copy c'tor //CVector(const CVector& aVec) = default; //melka kopie CVector(const CVector& aVec); // hluboka kopie // conv c'tor CVector(size_t aSize); TType At(size_t aIndex) const; void SetAt(size_t aIndex, TType aVal); void Alloc(size_t aSize); void Dealloc(); void Add(const CVector &aVec1, const CVector &aVec2); void Add(const CVector &aVec, TType aVal = 0); //implicitni parametr se uvadi jen v header file void Dump(const char *aStr = nullptr) const; ~CVector() //~ negace, good luck pro ty co jeste porad pouzivaji ceskou klavesnici //chytří si klavesnici umí přepnout nebo znají zkratky :D (y) //ale nekteri se snazi pouzivat jen ceskou a ty zkratky spis prodluzuji psani { Dealloc(); cout << "d'tor #" << iID << '\n'; --iLivingCounter; } size_t Size() { return iSize; } static size_t Living() { return iLivingCounter; } static size_t Total() { return iTotalCounter; } private: void CheckIndex(size_t aIndex) const { if(iSize <= aIndex) throw "Index mimo vektor"; } }; /* class CVector */ ///----- CVector.h konec ///----- CVector.cpp zacatek // #include "CVector.h" size_t CVector::iTotalCounter = 0; // Definice s inicializaci static promenne size_t CVector::iLivingCounter = 0; CVector::CVector(const CVector& aVec): iID(iTotalCounter++) // hluboka kopie { cout << "copy c'tor #" << iID << '\n'; iData = new TType[aVec.iCapacity]; iSize = aVec.iSize; iCapacity = aVec.iCapacity; for(size_t i = 0; i < iSize; ++i) iData[i] = aVec.iData[i]; ++iLivingCounter; } //vytvori prazdny vektor o poctu prvku aSize, prvky inicializovany na 0 CVector::CVector(size_t aSize): iID(iTotalCounter++) { cout << "conv c'tor #" << iID << '\n'; iData = new TType[aSize]; iSize = aSize; iCapacity = aSize; for(size_t i = 0; i < iSize; ++i) iData[i] = 0; ++iLivingCounter; } //TType Get( const CVector * const this, size_t aIndex); TType CVector::At(size_t aIndex) const { CheckIndex(aIndex); return iData[aIndex]; } void CVector::SetAt(size_t aIndex, TType aVal) //a { CheckIndex(aIndex); iData[aIndex] = aVal; } void CVector::Alloc(size_t aSize) // Neni potreba kontrolovat, jestli aVec == nullptr. { // aVec je totiz reference. if(iData) // aVec je platny https://i.imgflip.com/4hrk9k.jpg it aint much but its honest work - uz nejde link :( //funguje throw "Jiz naalokovano"; //while(true) // test bad_alloc // new double[100000000ul]; // iData = new TType[aSize]; iSize = aSize; iCapacity = aSize; for(size_t i = 0; i < iCapacity; ++i) iData[i] = 0; } void CVector::Dealloc(void) { delete[] iData; iSize = iCapacity = 0; iData = nullptr; } void CVector::Add(const CVector &aVec1, const CVector &aVec2) { if((aVec1.iSize != aVec2.iSize) || (aVec1.iSize != iSize)) throw("Vektory nejsou stejně velké"); for(size_t i = 0; i < iSize; ++i) iData[i] = aVec1.iData[i] + aVec2.iData[i];//zajisteni ze se bude operace provadet ve vysledkovem datovem typu } // Neni potreba pretypovavat aVec2.iData[i] - automaticky se prizpusobi prvnimu. void CVector::Add(const CVector &aVec, TType aVal) { if (aVec.iSize != iSize) throw("Vektory nejsou stejně velké"); //musime odkazovat na druhy vektor pres . for (size_t i = 0; i < aVec.iSize; ++i) iData[i] = aVec.iData[i] + aVal; } void CVector::Dump(const char *aStr) const//tisk vektoru { if(aStr) cout << aStr << ": "; cout << "{ "; for(size_t i = 0; i < iSize; ++i) cout << iData[i] << ", "; cout << "}\n"; } ///----- CVector.cpp konec ///----- main.cpp zacatek //#include "CVector.h" int main() { { CVector v(10); try { v.SetAt(9, 5.0); cout << v.At(9) << '\n'; CVector v1(10), v2(v1.Size()), v3(v1); v1.SetAt(9, 5.0); for(size_t i = 0; i < 10; ++i) { v1.SetAt(i, TType(i)); v2.SetAt(i, TType(10 + i)); } v1.Dump(); v2.Dump(); v3.Dump(); v3.Add(v2, v1); // do v3 = v1 + v2 v.Add(v1, v2); v1.Dump("v1"); v2.Dump("v2"); v3.Dump("v3"); } catch(const char aStr[]) { cout << "Vyjimka: " << aStr << '\n'; } catch(std::bad_alloc &exc) { cout << "Vyjimka bad_alloc: " << exc.what() << '\n'; // exc.what() ... kde vznikla vyjimka } catch(...) { cout << "Obecna vyjimka\n"; } int i = 42; cout << i++ << endl; //42 tiskne a 43 ulozi do i cout << ++i << endl; //44 tiskne a ulozi } cout << "V programu je nyni zivych: " << CVector::Living() << " instanci tridy CVector\n"; cout << "V programu bylo celkem: " << CVector::Total() << " instanci tridy CVector\n"; CVector bz; cout <<"sněhu kupy.\n"; return(0); }
run
|
edit
|
history
|
help
0
WinAPI not accessible
std::current_exception makes a copy
#7
algorithm_1
copy
Visual Studio C++ wont accept >> or << past the initial declarations
Union and possible undefined behavior
Additional layer of indirection
wcstombs_s wide string conversion with multibyte chars and locale + concatenation
Program_2