Verkettete Liste
-
Hab mir aus folgendem Thread, mal den Code hier genommen, um mir eine "verkettete Liste" zu verdeutlichen: http://c-plusplus.net/forum/viewtopic-var-p-is-1324660.html#1324660
#include <iostream> using namespace std; class SList //1. { public: typedef int value_type; private: class Node // Listenelement 2. { public: explicit Node( const value_type& x, Node* next = 0 ) :m_next( next ), m_value( x ) { } Node* m_next; value_type m_value; }; public: SList() // ersetzt das init() : m_kopf( value_type() ) , m_ende( &m_kopf ) {} ~SList() { clear(); } // immer schön wieder aufräumen void push_back( const value_type& x ) // ersetzt das einfuegen() was ein anhaengen() ist { m_ende->m_next = new Node( x ); m_ende = m_ende->m_next; } void clear() // ersetzt das ende() { for( Node* p = m_kopf.m_next; p; ) { Node* tmp = p; p = p->m_next; delete tmp; } m_kopf.m_next = 0; m_ende = &m_kopf; } // -- Ausgabe std::ostream& ausgeben( std::ostream& out, const char* delim = "" ) { for( Node* p = m_kopf.m_next; p; p = p->m_next ) { out << p->m_value << delim; } return out; } private: // Kopieren z.Zt. nicht vorgesehen; -> "Regel der drei" SList( const SList& ); SList& operator=( const SList& ); // -- Member Node m_kopf; Node* m_ende; }; int main() { return 0; }Also auf den ersten Blick versteh ich noch nicht so viel, und hab auch gleich mal 2 Fragen:
1. Woher kommt die Funktion "value_type()" Z.24? Das ist doch nur der Name vom typedef?
2. Was genau ist die "Regel der 3"?MfG
Stromberg
-
Weiß keiner was? Oder is es vll. nur so weit runtergerutscht?

-
Stromberg schrieb:
Also auf den ersten Blick versteh ich noch nicht so viel, und hab auch gleich mal 2 Fragen:
1. Woher kommt die Funktion "value_type()" Z.24? Das ist doch nur der Name vom typedef?Das ist keine Funktion sondern das Erzwingen der Standardinitialisierung (Bei einem Integer wäre das 0 bei einem Objekt der Standardkonstruktor...)-
Stromberg schrieb:
2. Was genau ist die "Regel der 3"?
http://tutorial.schornboeck.net/bigthree.htm
Davon abgesehen kannst du auch ein bischen Gedult üben
Zum einen ist heute in katholischen Bundesländern ein Urlaubstag, zum anderen ist es ja noch nicht wirklich alt...cu André
-
Ja, ja ich weiß, tut mir leid, mir hängen die Feiertage schon zum Hals raus, leb in der Stadt mit den meisten Feiertagen in Deutschland (wer Ahnung hat weiß es^^). Bins halt nich gewöhnt dass nach 12Std noch keiner zurückgeschrieben hat.
Bei folgendem Code hier:
#include <iostream> using namespace std; class test { public: test(int a_); ~test(); private: int m_a; }; test::test(int a_) :m_a(a_) { } test::~test() { } typedef int value; typedef test object; int main() { value a=value(); test A(object()); return 0; }ist a=0 und "test A(0)"? Also das "m_a" dann 0 ist? Oder wie ist das nochmal bei Objekten, da hast du gemeint da kommt der Standardkonstruktor hin, aber wie ist das genau gemeint?
MfG
Stromberg
-
Dann gewöhn Dich dran, Du bist nicht der einzige.
-
Das sollte gar nicht kompilieren, da test (alias object) keinen Standardkonstruktor hat.
Wenn du einen Konstruktor selbst anlegst, erzeugt dir der Compiler keinen Defaulkonstruktor mehr.
-
aalso:
erstens:int main() { value a=value();da value = int ist, steht hier im Endeffekt
int a = int();was soviel bedeutet, dass a defaultinitialisiert wird, was bei ints einer 0 entspricht.
zweitens:
test A(object());ist das gleiche wie
test A(test());hier machst du also folgendes: du uebergibst dem Konstruktor von A ein temporaeres Objekt vom Typ test. Dieses temporaere Objekt erzeugst du per deafault-Konstruktor. (test() erzeugt dieses temporaere Objekt oder versucht das zumindest).
Der Compiler sollte dir eigentlich diese letzte Zeile um die Ohren schmeissen, denn da du einen Ctor(int) definiert hast, gibts den Default-Ctor nichtmehr (Den copy-Ctor schon, der wird implizit generiert).
Was hingegen funktionieren wuerde ist folgendes:
test A(value()); // ist gleich test A(int());hier bekommt der Konstruktor von A ein temporaeres int uebergeben, das default-initialisiert wurde (also 0), weshalb danach A.m_a == 0
-
Das hier funktioniert bei mir aber ohne Fehlermeldung:
test A(object());!?
Ist der Wert bei einer defaulinitialisierung immer gleich "0"? Oder was ist bei
unsigned int(), unsigned long(), long(), char(), string(), float(), double()........?MfG
Stromberg
-
Stromberg schrieb:
Das hier funktioniert bei mir aber ohne Fehlermeldung:
test A(object());!?
Ist der Wert bei einer defaulinitialisierung immer gleich "0"? Oder was ist bei
unsigned int(), unsigned long(), long(), char(), string(), float(), double()........?Hallo Stromberg,
Falls 'object' ein 'eingebauter' Typ - also char über int bis double - ist, so ist der Wert immer 0. Bei string wird der Defaultkonstruktor aufgerufen und Du erhälst einen leeren String.
Gruß
Werner
-
test A(object()); macht nicht das was du denkst. Hier wird nicht etwa eine Instanz namens A vom Typ test konstruiert sondern eine Funktion A, die ein test zurückgibt und einen Funktionspointer auf ein weitere derartige Funktion als Parameter erwartet.
Deswegen geht das.
mach einfach mal folgendestest B(2); test A(object()); B = A;