Template für smartPointer
-
hi
bin gerade dabei mit hilfe eines c++buches ("der c++ programmierer"), mir smart pointer und templates genauer anzuschauen.
ich versuche jedes beispiel im buch nachzuvollziehen und auszuprobieren um es so besser zu verstehen...nun habe ich folgendes problem, und zwar geht es hier um ein template für smart pointer.
ich habe nun eine denke ich simple frage und zwar geht es dort um ein smartptr.t- datei die den code enthält.
(wenn ihr wollt kann ich den auch noch posten?)
diese wird dann in der main included.nun weiß ich aber nicht was eine ".t" datei überhaupt ist und wie ich diese anlege? (meine IDE Eclipse CDT)
kann mir da jemand nen link oder information geben?
weiß da jemand was zu?wenn ich einfach ein file anlege und es genauso nenne kann ich dieses i.wie nicht includen ...
lg
-
Namen sind Schall und Rauch. Wenn du mit .t Probleme hast, kannst du die Datei auch einfach .h nennen. Der Autor wollte da wohl ganz besonders betonen, dass er Templates macht.
-
manni66 schrieb:
Namen sind Schall und Rauch. Wenn du mit .t Probleme hast, kannst du die Datei auch einfach .h nennen. Der Autor wollte da wohl ganz besonders betonen, dass er Templates macht.
ach so ok, das hatte ich auch gedacht...
hab auch noch nix von einer .t in diesem zusammenhang gehört...aber i.wie funktioniert es nicht wenn ich es einfach als .h in dem projekt hinzufüge
...
weißt du woran das liegen kann?weiß mich nicht mehr zu helfen...
hilft vll der code was?
-
#ifdef SMARTPTR_H #define SMARTPTR_H #include "NullPointerException.h" template <typename T> class SmartPointer { public: SmartPointer( T *p = nullptr ); ~SmartPointer(); //Nicht virtual: Vererbung ist nicht geplant! T* operator -> () const; T& operator * () const; SmartPointer& operator=( T *p ); operator bool() const; private: T* zeigerAufObjekt; void check() const; //Pruefung auf nicht Null //Ergaenzung folgen... }; template <typename T> inline SmartPointer<T>::SmartPointer( T *p ) :zeigerAufObjekt {p} { } template <typename T> inline SmartPointer<T>::~SmartPointer() { delete zeigerAufObjekt; } template <typename T> inline void SmartPointer<T>::check() const { if(!zeigerAufObjekt) { throw NullPointerException(); } } template <typename T> inline T* SmartPointer<T>::operator->() const { check(); return zeigerAufObjekt; } template <typename T> inline T& SmartPointer<T>::operator operator*() const { check(); return zeigerAufObjekt; } template <typname T> inline SmartPointer<T>::operator bool() const { return bool(zeigerAufObjekt); } #endifdas wäre die SmartPtr.t...
wie könnte ich diese jetzt in der main nutzen?
include "SmartPtr.t" gibt kein compiler fehler...die klasse wird aber nicht gefunden und die fehlermeldung "error: 'SmartPointer' does not name a type"
kann mir da jemand bitte helfen oder nen tipp geben... ?
-
keineAhnung? schrieb:
wie könnte ich diese jetzt in der main nutzen?
include "SmartPtr.t" gibt kein compiler fehler...die klasse wird aber nicht gefunden und die fehlermeldung "error: 'SmartPointer' does not name a type"
kann mir da jemand bitte helfen oder nen tipp geben... ?
zeig doch mal den Code, wo du versuchst, das Template zu verwenden. Hattest du überhaupt schonmal mit Templates zu tun?
-
keineAhnung? schrieb:
include "SmartPtr.t" gibt kein compiler fehler...
Änder mal die erste Zeile von
#ifdef SMARTPTR_H
nach
#ifndef SMARTPTR_H
-
daddy_felix schrieb:
keineAhnung? schrieb:
wie könnte ich diese jetzt in der main nutzen?
include "SmartPtr.t" gibt kein compiler fehler...die klasse wird aber nicht gefunden und die fehlermeldung "error: 'SmartPointer' does not name a type"
kann mir da jemand bitte helfen oder nen tipp geben... ?
zeig doch mal den Code, wo du versuchst, das Template zu verwenden. Hattest du überhaupt schonmal mit Templates zu tun?
ja hatte ich aber nicht so... deswegen übe bzw. gehe ich ja den teil gerade im buch durch...

jo ok hier ist der teil der main.cpp...
//main.cpp #include "smartptr.t" //#include "SmartPtr.h" #include <iostream> using namespace std; class A { public: virtual void hi() { cout << "hier ist A::hi() !" << endl; } virtual ~A() { cout << "A::Destruktor..." << endl; } }; class B : public A { virtual void hi() { cout << "hier ist B::hi() !" << endl; } virtual ~B() { cout << "B::Destruktor..." << endl; } }; template<typename T> void perReferenz( const SmartPointer<T>& p) { cout << "Aufruf: per Referenz ( const SmartPointer<T>x ): "; p->hi(); } int main() { cout << "Zeiger auf dynamische Objekte: " << endl; cout << "Konstruktoraufruf" << endl; SmartPointer<A> spA(new A); cout << "Operator ->" << endl; spA -> hi(); cout << "Operator *" << endl; (*spA).hi(); cout << "Polymorphismus:" << endl; SmartPointer<A>spAB(new B); //zeigt auf b-objekt spAB->hi(); //B::hi() perReferenz(spAB); //Parameter übergabe eines smart pointer SmartPointer<B> spUndef; try { if(!spUndef) { cout << "undefinierter Zeiger: " << endl; //Zugriff auf nichtinitialisierten Zeiger bewirkt Laufzeitfehler } spUndef -> hi(); //Laufzeitfehler! (*spUndef).hi(); //Laufzeitfehler! }catch (const NullPointerException& ex) { cout << "Laufzeitfehler!" << ex.what() << endl; } //alle folgenden Anweisungen bewirken Fehlermeldungen des Compilers //Typkontrolle: A ist kein B SmartPointer<B> spTyp (new A); //Fehler //initialiserung mit kopierkonstruktor ist nicht möglich: SmartPointer<A> spY = spA; //Fehler //zuweisung ist nicht möglich: SmartPointer<A> spA1; spA1 = spA; //Fehler }ist auch alles 1:1 aus dem buch übernommen... die fehlermeldung
'SmartPointer' does not name a typedeutet ja darauf hin das er die smartptr.t nicht findet bzw. i.wie nicht "nutzt" aber wieso? wenn ich es als header kann ich das file includen abe rnicht nutzen... also ich versteh nicht wieso es nicht klappt...
was kann ich tun das es funktioniert bzw. was mach ich falsch?
-
Furble Wurble schrieb:
keineAhnung? schrieb:
include "SmartPtr.t" gibt kein compiler fehler...
Änder mal die erste Zeile von
#ifdef SMARTPTR_H
nach
#ifndef SMARTPTR_Hdanke damit funktioniert es ... vielen vielen dank...
ich bin so blööd
das hätte ich sehen und finden müssen...
bin alles mehrere male durch gegeangen...

vielen dank..!!!
problem gelöst!