mini Quellcode mit Anfängerfehler
-
Konrad Rudolph schrieb:
Redhead schrieb:
gast0815 schrieb:
Folgendes hab ich aufgrund eines c++-Buches angenommen: Ich dachte, der Standard-ctor belegt alle Variablen einer Klasse mal mit Null.
Diese Annahme ist ein Irrtum
Wie kommst Du darauf? Die Annahme ist korrekt. Nicht-initialisierte Variablen einer Klasse werden mit Nullwerten initialisiert (genauer gesagt: dem Standard-Konstruktor).
Die eingebauten Datentypen haben keinen Standardkonstruktor.
-
bluecode schrieb:
Die eingebauten Datentypen haben keinen Standardkonstruktor.
Ah?
#include <iostream> int main() { int i = int(); std::cout << i << std::endl; }
-
Dann pack doch mal dein i in ne klasse und versuchs. Da kommt bei mir nicht 0 aus.
-
...und versuch das mal mit nem Zeiger

-
bluecode schrieb:
Dann pack doch mal dein i in ne klasse und versuchs. Da kommt bei mir nicht 0 aus.
Habe ich.

Zugegeben, ich habe geschummelt: Ich habe die Klasse explizit initialisiert:
#include <iostream> struct Test { char* c; int i; float f; }; int main(int argc, char* argv[]) { using namespace std; Test foo = Test(); cout << foo.i << endl << (int)foo.c << endl << foo.f << endl; }
-
Zeigefinger schrieb:
...und versuch das mal mit nem Zeiger

Ja, und wo soll da das Problem sein?
// [...] int* i = new int(); cout << i << endl << *i << endl; delete i;Gibt mir sowas aus:
00356078 0
-
Den Zeiger direkt mit Heap zu befüllen war nicht gefordert!
Und
int* i = int*();will nicht so recht klappen :p
-
Konrad Rudolph schrieb:
Zugegeben, ich habe geschummelt: Ich habe die Klasse explizit initialisiert
Stimmt, wenn man das explizit macht, (scheint) es zu funktionieren... verwundert mich ein wenig
, aber ob das jetzt die Lösung ist? Ich weiß nicht... ich würd/werd lieber explizit den konstruktor aufrufen und nicht blind darauf vertrauen, dass ich mich beim Benutzen der Klasse noch daran erinner 
-
LordJaxom schrieb:
Den Zeiger direkt mit Heap zu befüllen war nicht gefordert!
Ach so, habe ich falsch verstanden.
LordJaxom schrieb:
Und
int* i = int*();will nicht so recht klappen :p
Doch, wieso nicht?! Die ganze STL baut doch darauf auf, dass man Basistypen konstruieren kann ...
typedef int* T; int* pi = T();Klappt wunderbar.
-
#include <iostream> //iostream.h ist veraltet! using namespace std; //das zeug aus iostream und das andere standard-zeug ist im namespace std template<typename T> class List { class Node { public: Node(T value) : m_value(value), m_next(0) {} //konstruktor mit initialisierungsliste T m_value; Node *m_next; }; Node *m_first, *m_last; public: List() : m_first(0) {} //konstruktor mit initialisierungsliste ~List() { clear(); } void clear() { Node *current; while(m_first) { current = m_first; m_first = m_first->m_next; delete current; } } void append(T value) { if(!m_first) m_last = m_first = new Node(value); else m_last = m_last->m_next = new Node(value); } void show() { for(Node *current = m_first; current != 0; current = current->m_next) cout << current->m_value << endl; } }; int main() { List<char> test; test.append('a'); test.append('b'); test.append('c'); test.show(); }
-
int* pi; std::cout << pi << "\n" << *pi << "\n";*päng*
Sein Ursprungsproblem war ein nicht initialisierter Zeiger, und die Zeigen nicht per Default auf NULL, jedenfalls müssen sie das nicht. Sprich: Undefiniertes Verhalten!
-
Konrad Rudolph schrieb:
typedef int* T; int* pi = T();Klappt wunderbar.
Klar doch, aber willst Du einen Anfänger wirklich gleich mit typedefs erschlagen?
