====== C++ Crashkurs / Übung 8 ====== Smart-Pointer und Templates mit verschachtelten Typen. **Ueb4b.h:** // File : Ueb4b.h // #include "..\stdafx.h" #include #include #include "Ueb4b.VerketteteListe.h" using namespace Ueb4b; template void ListeAusgeben (const CListe& liste, const char* pszHeader) { std::cout << pszHeader << std::endl; for (auto iter = liste.begin(); iter != liste.end(); ++iter) { std::cout << " " << *iter << std::endl; } } int _ueb (int argc, _TCHAR* argv[]) { auto pListe1 = std::make_shared>(); pListe1->ElementAnhaengen("47-11"); pListe1->ElementAnhaengen("0-8-15"); pListe1->ElementAnhaengen("Die Antwort auf alle Fragen..."); ListeAusgeben(*pListe1, "Liste:"); // delete pListe1; // Wird durch Smart Pointer automatisch erledigt return 0; } // EOF **Ueb4b.VerketteteListe.h:** // File : Ueb4b.VerketteteListe.h // namespace Ueb4b { template class CListe { private: class CListenElement { friend CListe; private: TElement nInhalt; // CListenElement* pNaechster; std::shared_ptr pNaechster; public: CListenElement (TElement newInhalt) { nInhalt = newInhalt; // pNaechster = nullptr; // Initialisierung erfolgt durch Smart Pointer } ~CListenElement () { // delete pNaechster; // Keine Freigabe nötig - das erledigt der Destructor von dem Smart Pointer // pNaechster = nullptr; } TElement GetInhalt () { return nInhalt; } // CListenElement* GetNaechster () std::shared_ptr GetNaechster () { return pNaechster; } }; class CListeIterator { private: CListenElement* element; public: CListeIterator (CListenElement* pElem) { element = pElem; } bool operator!=(CListeIterator another) { return (this->element != another.element); } CListeIterator& operator++() { // element = element->GetNaechster(); element = element->GetNaechster().get(); return *this; } TElement operator*() { return element->GetInhalt(); } }; public: // CListenElement* pStart; std::shared_ptr pStart; CListe () { // pStart = nullptr; } CListe (const CListe& other) { // pStart = nullptr; for (auto iter = other.begin(); iter != other.end(); ++iter) ElementAnhaengen(*iter); } // ~CListe () // Destructor kann wegfallen, weil sowieso leer. // { // delete pStart; // pStart = nullptr; // } CListe& operator=(const CListe& other) { // if (pStart != nullptr) delete pStart; pStart = nullptr; // Freigabe erfolgt automatisch for (auto iter = other.begin(); iter != other.end(); ++iter) ElementAnhaengen(*iter); return *this; } CListeIterator begin () const { // return CListeIterator(pStart); return CListeIterator(pStart.get()); } CListeIterator end () const { return CListeIterator(nullptr); } void ElementAnhaengen(TElement nInhalt) { // auto pNeu = new CListenElement(nInhalt); auto pNeu = std::make_shared(nInhalt); if (pStart == nullptr) { pStart = pNeu; } else { auto pLetztes = pStart; while (pLetztes->GetNaechster() != nullptr) pLetztes = pLetztes->GetNaechster(); pLetztes->pNaechster = pNeu; } // if } }; } // EOF **Programm.cpp:** - Der Einstiegspunkt // Programm.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "Ueb4b.h" int _tmain (int argc, _TCHAR* argv[]) { return _ueb(argc, argv); } // EOF **stdafx.h:** // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #pragma once #include "targetver.h" #include #include // TODO: reference additional headers your program requires here #include #include // EOF **targetver.h:** // Including SDKDDKVer.h defines the highest available Windows platform. // If you wish to build your application for a previous Windows platform, include WinSDKVer.h and // set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. #pragma once #include ---- Stand: 19.09.2014 --- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]// EOF