C++, suche Tutorial

Häng mal nach jedem cin >> ...;
folgendes an:
Code:
if(cin.fail())
{
    cout << "Einlesen fehlgeschlagen" << endl;
}
Vielleicht siehst den Übeltäter dann schon.
 
Was unterscheidet eine Struktur von einer Klasse? :devil: Technisch gesehen handelt es sich bei beiden um Datenstrukturen und Compiler unterscheiden diese beiden auch nur im verwendeten default Zugriffsmodus.
Naja^^
Klassen und Strukturen gleichsetzen würde ich jetzt eher nicht. Gibt schon teilweise ähnlichkeiten aber Klassen sind noch ein Stück komplexer... wenn ich schon an die Sachen mit Vererbung denke, also dann noch Kindklassen etc. oder Virtuelle Funktionen (oder eher Methoden)... da steckt schon ein Stück mehr dahinter als bei den Strukturen^^
Obwohl strukturiert natürlich nicht schlecht ist aber naja... wenn man das Themengebiet OOP richtig einsetzt hat das an manchen stellen schon feine Sachen.
 
In C++ sind structs Klassen mit public-modifizierer als default. Man kann die auch Vererben.
Code:
struct Test
{
    Test();
    ~Test();
};

// ist gleich

class Test
{
public:
    Test();
    ~Test();
};

In C sieht die Sache natürlich anders aus, aber da gibt es ja eh keine Klassen ;)
 
Ich wollte ja auch nur etwas nennen...
und wie siehts mit Virtuellen Sachen bei stuct aus? :schief:

Man nimmt schon nicht umsonst Klassen bei C++ anstatt Strukturen.
 
Außer mit dem public/private gibt es keinerlei Unterschiede in C++. Es ist also vollkommen Wurst, ob du class oder struct nimmst, zumindest solange du alle Modifizierer hinschreibst.

Hier mal ein Artikel von IBM zu dem Thema.
 
... und warum hat man dann Klassen eingefügt wenn es deiner Meinung nach keinerlei Unterschied gibt :schief:
Sieh es ein: Klassen haben einfach mal Vorteile gegenüber Strukturen - bei richtiger Nutzung.
 
Hast du den Artikel überhaupt gelesen? :ugly:

Because the only difference between a structure and a class is that structure members have public access by default and class members have private access by default, you can use the keywords class or struct to define equivalent classes.
Du kannst ja auch
Code:
template <typename T>
oder
Code:
template <class T>
schreiben und es meint exakt dasselbe.


Hab das mal gerade getestet:
Code:
#include "stdafx.h"

struct TestA
{
    TestA() {}
    virtual ~TestA() {}

    virtual void func()
    {
        _tprintf(_T("TestA\n"));
    }
};

struct TestB : public TestA
{
    TestB() {}
    virtual ~TestB() {}

    virtual void func()
    {
        _tprintf(_T("TestB\n"));
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    TestA *ptrA = new TestA();
    TestA *ptrB = new TestB();

    ptrA->func();
    ptrB->func();

    delete ptrB;
    delete ptrA;

    return 0;
}
Ausgabe:
TestA
TestB

(mit VS2010)

Nochmal: Ich beziehe mich ausdrücklich auf C++. In C sind structs was ganz anderes!
 
... und warum hat man dann Klassen eingefügt wenn es deiner Meinung nach keinerlei Unterschied gibt :schief:
Sieh es ein: Klassen haben einfach mal Vorteile gegenüber Strukturen - bei richtiger Nutzung.
Ok, betrachten wir das mal einfach was genauer. ;)

Was ist denn eine Struktur? Ein Konstrukt (ich musst mich jetzt echt zusammen nehmen um nicht Objekt zu schreiben) das mehrere zusammenhängende Wert als logische Einheit speichern kann, oder?

Und was ist eine Klasse? Vereinfacht betrachtet ist es auch ein Konstrukt wie eine Struktur, nur das man hier noch die Funktionen mit dazu nimmt. Bezeichnet man dann als Objekt und hat den riesen Vorteil, dass man nicht nur die Eigenschaft sondern auch das Verhalten definieren kann.

Soweit, so gut. ;)

Nur wenn man sich jetzt mal ansieht was der Compiler daraus macht (dabei unterscheiden sich reine C Compiler gar nicht so sehr von den C++ Compilern), dann stellt man fest, dass es eigentlich keinen großen Unterschied gibt. Wie Bingo schon geschrieben hat, macht ein C++ bei Strukturen und Klassen das gleiche, bis auf den kleinen Unterschied mit den Zugriffmodifikator. Und da kannst du dich auf den Kopf stellen wie du willst, das ist einfach per definition so. ;)

Ein C Compiler macht sich das Leben sehr einfach und schreibt Datenfelder einfach schön hintereinander (unter zur Hilfenahme der Ausrichtungsgröße, die man bei x86 Maschine ja auch mal vergessen darf ohne das die Anwendung abschmiert). Was sich auf den ersten Moment wie ein riesen Unterschied anhört, stellt aber kein Problem da, da der C++ Compiler nichts anderes macht! :-P Auch hier werden einfach nur alle Variablen nacheinander aufgelistet (vtab, also die Tabelle mit den Virtuellen Funktionen ist auch nichts anderes als eine Variable wenn man es mal genau betrachtet). Die Funktionen einer Klasse stehen ja gar nicht im Objekt selber, sondern bekommen (in der einfachsten Version der Compiler Implementierung) einfach einen weiteren Parameter (das this objekt quasi) und gut ist.

Also technisch gesehen gibt es keinen Unterschied. ;)
 
Ich mach gerade ne große Integration und da treten immer wieder mehr oder weniger lustige Dinge auf:
GoodBye.JPG
 
Solche Meldungen gibt es aber sehr oft, ne nach Compiler/Entwicklungsumgebung kannst du auch die Schwelanzahl bestimmen, aber der abgebrochen werden soll.
 
Jaja schon klar, meistens kommt aber nur eine Overflowmeldung, hier hat man sich wohl die Mühe gemacht den user wenigstens noch zu verabschieden.
Ansich ist es mir hier auf Arbeit wurscht wie viele Meldungen da kommen da ich normalerweise gleich sehe wo es hängt, sind ja dann meistens nur Folgefehler.
 
Ok:


#include<iostream>
#include<string>
using namespace std;

enum land
{
Deutschland=0, Oesterreich, Schweiz, England, Frankreich
};


struct Lieferanschrift
{
string Vorname;
string Nachname;
string Strasse;
int Hausnummer;
int Postleitzahl;
string Ort;
land MeinLand;
};




struct Kreditkartendaten
{ int Kreditkartennummer;
int KreditkartenGueltigkeitsdatum;
};


struct Bestellung
{ Lieferanschrift MeineLieferanschrift;
Kreditkartendaten MeineKreditkartendaten;
string bestellteWare;
};









int main()
{
Bestellung MeineBestellung;
Kreditkartendaten MeineKreditkartendaten;
Lieferanschrift MeineLieferanschrift;
int Landcode;



MeineBestellung.MeineLieferanschrift.MeinLand = static_cast<land>(Landcode);
string bestellteWare;

cout <<"Geben sie Ihre zu bestellende Ware ein" << endl;
cin >> MeineBestellung.bestellteWare;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}


cout <<"Geben sie Ihren Vornamen ein" << endl;
cin >> MeineBestellung.MeineLieferanschrift.Vorname;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}
cout <<"Geben sie Ihren Nachnamen ein" << endl;
cin >> MeineBestellung.MeineLieferanschrift.Nachname;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}
cout <<"Geben sie Ihre Strasse ein" << endl;
cin >> MeineBestellung.MeineLieferanschrift.Strasse;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}
cout <<"Geben sie Ihre Hausnummer ein" << endl;
cin >> MeineBestellung.MeineLieferanschrift.Hausnummer;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}
cout <<"Geben sie Ihre Postleitzahl ein" << endl;
cin >> MeineBestellung.MeineLieferanschrift.Postleitzahl;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}
cout <<"Geben sie Ihren Ort ein" << endl;
cin >> MeineBestellung.MeineLieferanschrift.Ort;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}
cout <<"Geben sie Ihr Land ein" << endl;
cin >> Landcode;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}


cout <<"Geben sie Ihre Kreditkartennummer ein" << endl;
cin >> MeineBestellung.MeineKreditkartendaten.Kreditkartennummer;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}

cout <<"Geben sie Ihr Kredikarten Gültigkeitsdatum ein" << endl;
cin >> MeineBestellung.MeineKreditkartendaten.KreditkartenGueltigkeitsdatum;
if(cin.fail())
{
cout << "Einlesen fehlgeschlagen" << endl;
}

cout <<"Ihre Bestellung:" <<endl;
cout <<"Name:" << MeineBestellung.MeineLieferanschrift.Vorname << " " << MeineBestellung.MeineLieferanschrift.Nachname << endl;
cout <<"Adresse:" << MeineBestellung.MeineLieferanschrift.Strasse << " " << MeineBestellung.MeineLieferanschrift.Hausnummer <<" " << MeineBestellung.MeineLieferanschrift.Postleitzahl << " " << MeineBestellung.MeineLieferanschrift.Ort << " " << Landcode << endl;
cout <<"Kreditkartendaten:" << MeineBestellung.MeineKreditkartendaten.Kreditkartennummer <<" "<< MeineBestellung.MeineKreditkartendaten.KreditkartenGueltigkeitsdatum << endl;
system("Pause");
}
 
Ok, betrachten wir das mal einfach was genauer. ;)

Was ist denn eine Struktur? Ein Konstrukt (ich musst mich jetzt echt zusammen nehmen um nicht Objekt zu schreiben) das mehrere zusammenhängende Wert als logische Einheit speichern kann, oder?

Und was ist eine Klasse? Vereinfacht betrachtet ist es auch ein Konstrukt wie eine Struktur, nur das man hier noch die Funktionen mit dazu nimmt. Bezeichnet man dann als Objekt und hat den riesen Vorteil, dass man nicht nur die Eigenschaft sondern auch das Verhalten definieren kann.

Soweit, so gut. ;)

Nur wenn man sich jetzt mal ansieht was der Compiler daraus macht (dabei unterscheiden sich reine C Compiler gar nicht so sehr von den C++ Compilern), dann stellt man fest, dass es eigentlich keinen großen Unterschied gibt. Wie Bingo schon geschrieben hat, macht ein C++ bei Strukturen und Klassen das gleiche, bis auf den kleinen Unterschied mit den Zugriffmodifikator. Und da kannst du dich auf den Kopf stellen wie du willst, das ist einfach per definition so. ;)

Ein C Compiler macht sich das Leben sehr einfach und schreibt Datenfelder einfach schön hintereinander (unter zur Hilfenahme der Ausrichtungsgröße, die man bei x86 Maschine ja auch mal vergessen darf ohne das die Anwendung abschmiert). Was sich auf den ersten Moment wie ein riesen Unterschied anhört, stellt aber kein Problem da, da der C++ Compiler nichts anderes macht! :-P Auch hier werden einfach nur alle Variablen nacheinander aufgelistet (vtab, also die Tabelle mit den Virtuellen Funktionen ist auch nichts anderes als eine Variable wenn man es mal genau betrachtet). Die Funktionen einer Klasse stehen ja gar nicht im Objekt selber, sondern bekommen (in der einfachsten Version der Compiler Implementierung) einfach einen weiteren Parameter (das this objekt quasi) und gut ist.

Also technisch gesehen gibt es keinen Unterschied. ;)
Ok das akzeptiere ich! :)
Aber warum nimmt man dann bei C++ trotzdem eher Klassen als Strukturen?
 
Also das hier sagt Bjarne Stroustrup (der Entwickler von C++) zu dem Thema (The Design and Evolution of C++):
At this point, the object model becomes real in the sense that an object is more than the simple aggregation fo the data members of a class. An object of a C++ class with a virtual function is a fundamentally different beast from a simple C `struct`. Then why did I not at this point choose to make structs and classes different notions?
My intent was to have a single concept: a single set of layout rules, a single set of lookup rules, a single set of resolution rules, etc... I was convinced that if `struct` came to mean "C and compatibility" to users and `class` came to mean "C++ and advanced features," the community would fall into two distinct camps that would soon stop communicating. Beingn able to use as many or as few language features as needed when designing a class was an important idea to me. Only a single concept would support my ideas of a smooth and gradual transition from "traditional C-style programming," through class abstraction, to object-oriented programming. Only a single concept would support this notion of "you only pay for what you use" ideal.
Ich meine mich auch zu erinnern, mein Chef hatte mir mal erzählt, dass als sie damals mit C++ angefangen haben, gab es das class Keyword noch garnicht, sondern nur struct.
 
Zurück