PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Klassen und Objekte... ich raffs net


Urion
2011-06-18, 14:34:20
moin

ich versuch mich grad am objektorientieren Proggen mit C++
hab schon x tutorials gelesen und alle bücher durchwühlt
irgendwas schein ich net zu raffen...

simples Beispiel:

mein header:

#ifndef haus_h
#define haus_h

class gebaude
{
private:
int Plz;


public:
gebaude();
~gebaude();

void setPlz(int einePlz);

int getPlz();

};

#endif


meine anweisung:
#include <iostream>
#include <string.h>
#include "haus.h"

using namespace std;



void gebaude::setPlz(int einePlz)
{
einePlz=Plz;
}



int gebaude::getPlz()
{
return Plz;
}

mein "programm" :D

#include <iostream>
#include <string.h>
#include "haus.h"

using namespace std;

int main()
{

gebaude meinhaus();

//meinhaus.setPlz(12345);

//cout << meinhaus.getPlz();

system("pause");
return 0;
}

wo ist der Denkfehler??
Compiler sagt was von unresolved external symbolic

Marscel
2011-06-18, 14:53:12
Du hast mit

gebaude();
~gebaude();

Konstruktor und Destruktor deklariert. Aber nirgendwo definiert.

Also entweder schreibst du in deine haus.cpp (?) eine Definition der beiden oder du entfernst sie aus der Klassendeklaration.

Und zusätzlich darfst du in C++ nicht
gebaude meinhaus();

schreiben, wenn du keine Parameter übergibst, da müssen die Klammern weg.

Tiamat
2011-06-18, 14:54:44
1) Die Zuweisung ist falsch rum bei setPlz().
2) gebaude foo; in main reicht;
3) wozu system("pause") ?

Urion
2011-06-18, 15:02:49
aha :biggrin:

genau in haus.cpp steht die anweisung mit get und set....

jetzt gehts schonmal... dann muss ich mir das mit dem Konstruktor nochmal angucken....

irgendwie gabs doch nen default Konstruktor den der Compiler automatisch einfügt?

system("pause"); is nur damit die konsole nicht gleich zu geht...

danke so weit :D

redfalcon
2011-06-18, 15:05:49
irgendwie gabs doch nen default Konstruktor den der Compiler automatisch einfügt?



Ja, aber das macht der Compiler intern. Den brauchst du nur explizit zu deklarieren, wenn du den Default-Constructor auch wirklich nutzen willst und dann gleich Anweisungen mit rein schreibst. Also z.B. das Objekt mit Standardwerten initialisieren willst.

Marscel
2011-06-18, 15:07:23
irgendwie gabs doch nen default Konstruktor den der Compiler automatisch einfügt?

Das tut er auch, nur wenn du einen eigenen deklarierst, verzichtet er selbst darauf und wartet bis zum Linken, dass er deine Definition bekommt.

ShadowXX
2011-06-18, 15:07:48
irgendwie gabs doch nen default Konstruktor den der Compiler automatisch einfügt?

Ja, aber nur wenn du die Deklaration im Header weglässt....

Gnafoo
2011-06-18, 15:13:56
Und zusätzlich darfst du in C++ nicht
gebaude meinhaus();

schreiben, wenn du keine Parameter übergibst, da müssen die Klammern weg.

Ergänzende Info:

Von der Denkweise her ist es nicht falsch. Nur kann das in C++ zwei Dinge bedeuten. Einerseits kann man das als Definition eines Objektes auffassen, andererseits als Deklaration einer Funktion ohne Parameter, die gebaude als Rückgabetyp hat. Der Standard entfernt die Mehrdeutigkeit, indem er explizit festlegt, dass es als Funktionsdeklaration interpretiert werden muss und dementsprechend geht das hier schief.

Da die Variablendefinition aber auch ohne die Klammern funktioniert (im Gegensatz zur Funktionsdeklaration), kann man die Mehrdeutigkeit so auflösen. Das ist auch bekannt als der „most vexing parse“.

Urion
2011-06-18, 15:14:48
Ja, aber das macht der Compiler intern. Den brauchst du nur explizit zu deklarieren, wenn du den Default-Constructor auch wirklich nutzen willst und dann gleich Anweisungen mit rein schreibst. Also z.B. das Objekt mit Standardwerten initialisieren willst.


so?

in die header:

gebaude(int post)
~gebaude()

in die haus.cpp
// Konstruktor
gebaude::gebaude(int post)
{
einePlz=post;
}

gebaude::~gebaude()
{
}

Tiamat
2011-06-18, 15:40:51
explicit gebaude(int post), wenn du verhindern willst, dass jemand den Standardkonstruktor aufruft.
Und im Desktuktor steht keine Anweisung -> unnötig.

redfalcon
2011-06-18, 17:07:10
so?

in die header:

gebaude(int post)
~gebaude()

in die haus.cpp
// Konstruktor
gebaude::gebaude(int post)
{
einePlz=post;
}

gebaude::~gebaude()
{
}

Ja, wobei einePlz natürlich noch irgendeinen Datentyp brauch. Solange der Destructor leer ist kannst du den wie schon gesagt auch weglassen.

Nakai
2011-06-18, 17:33:27
Nur eine Bemerkung am Rande:
PLZ sollte kein INT sein, da eine 0 am Anfang(was es als PLZ gibt) einer Zahl zum Problem wird. ;)

PatkIllA
2011-06-18, 17:39:13
Nur eine Bemerkung am Rande:
PLZ sollte kein INT sein, da eine 0 am Anfang(was es als PLZ gibt) einer Zahl zum Problem wird. ;)
Kann man bei der Ausgabe entsprechend formatieren. IMO die bessere Lösung bevor man mit Strings oder sonstigen Arrays hantiert. Ich bin beim Parsen nur schon mal drauf reingefallen, dass Zahlen mit führender Null als Oktal angesehen wurde.

Trap
2011-06-18, 17:40:24
Nur eine Bemerkung am Rande:
PLZ sollte kein INT sein, da eine 0 am Anfang(was es als PLZ gibt) einer Zahl zum Problem wird. ;)
Wie wärs mit einer enum? :biggrin:

Postleitzahl macht man am besten zu einer eigenen Klasse. Für Postleitzahlen gelten genügen eigene und spezielle Eigenschaften, dass man dafür keinen eingebauten Datentyp nehmen sollte.

Urion
2011-06-18, 18:29:45
ich kämpfe immernoch :D

das ganze ist ne aufgabe und man soll eine klasse gebäude erstellen mit
den werten plz, straße, ort, größe,art usw

und zwar mit dem defaultkonstruktor, destruktor, konstruktor zum setzen der werte, copykonstruktor, getter und setter für einzelne membervariablen und mit ner printmethode ausgeben....

allerdings weiss ich jetzt garnicht wie man mehrere konstruktoren in eine klasse machen soll...

und in jeder literatur stehts irgendwie anders...

ich bin verwirrt :biggrin:

Kenny1702
2011-06-18, 18:45:35
Auch wenn ich in C++ nicht so bewandert bin, was spricht dagegen mehrere Konstruktoren wie

gebaude()
gebaude(int post)
gebaude(int post, string ort)

oder einfach

gebaude()
gebaude(Adresse anschrift)

,wobei Adresse selbst wieder eine Klasse oder Structure ist, zu benutzen.

Tiamat
2011-06-18, 19:54:25
Keine Ahnung, was das für Bücher sind, aber die scheinen nichts zu taugen. Ich empfehl dir mal n gutes Buch : C++ Kompendium (http://www.amazon.de/Kompendium-Das-komplette-Programmierwissen-Studium/dp/3827245826/ref=sr_1_5?ie=UTF8&qid=1308419560&sr=8-5).

ShadowXX
2011-06-19, 02:26:34
und in jeder literatur stehts irgendwie anders...

Das glaub ich mal weniger....es mag verschieden beschrieben sein, aber es muss immer auf das gleiche hinauslaufen.

Und ohne dich jetzt entmutigen zu wollen...das sind die Basics von C++

Marscel
2011-06-19, 03:27:54
Das glaub ich mal weniger....es mag verschieden beschrieben sein, aber es muss immer auf das gleiche hinauslaufen.

Es gibt leider doch einige Arten Hello-World zu verhunzen.