PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerproblem in C++


AnSa
2004-09-19, 08:46:54
Ich versuche gerade auf einem alten Compiler von C auf C++ unzusteigen.
Dabei habe ich folgendes Problem:
a)

void moda();

class X
{public:
int a;
X::X();
};
X::X(){a=1;}

void main()
{
X Klasse;
moda();
}

void moda()
{Klasse.a=2;} //Hier erkennt der Comp "Klasse" nicht, wie kann ich
//darauf aus einer Funktion aus zugreifen??

b)
Genausowenig kann ich mit den Methoden anderer Klassen aud die Methoden/Attribute der Klasse X zugreifen. Wie ist dies möglich?

Ich wäre für jede konstruktive Antwort dankbar!

Ganon
2004-09-19, 08:53:30
Du hast das Objekt in der main-Funktion erzeugt. Das heißt sie ist auch nur in dieser erreichbar.

Entweder du übergibst (Zeiger?) das Objekt an die Methode, oder du definierst sie global, d.h. über der main-Funktion.

AnSa
2004-09-19, 08:56:07
Vielen Dank schon mal, das mit global hilft schon einmal weiter.
Doch könnte mir jemand zeigen wie das mit dem Zeiger geht?

Und das Problem b) mit dem Aufruf aus anderen Klassen?? wie geht dies?? :biggrin:

Coda
2004-09-19, 10:34:10
Hm, bist du sicher dass du mit C schon fertig warst? Klassen verhalten sich wie Strukturen mit Zugriffsbeschränkungen, Vererbung und Memberfunktionen, du kannst nicht global auf sie zugreifen.
Du must die Klasse immer irgendwie übergeben oder sie global erschaffen.

void moda();

class X
{
public:
X();
int a;
};

X::X()
{
a=1;
}

void main()
{
X Klasse;
moda(Klasse);
}

void moda(X &Klasse)
{
Klasse.a=2;
}

Corrail
2004-09-19, 13:51:20
Pass aber auf bei der Übergabe von eigenen Datentypen (Klassen) an Funktionen, ohne Verwendung von Pointer oder References, wie z.B.:

void moda();

class X
{
public:
X();
int a;
};

X::X()
{
a=1;
}

void main()
{
X Klasse;
moda(Klasse);
}

void moda(X Klasse) // <-- OHNE &, also übergabe per Value
{
Klasse.a=2;
}



Bei diesem Beispiel sollte es noch kein Problem sein, aber sobald du mit dynamischen Daten innerhalb der Klasse erbeitest brauchst du für diese Beispiel für die Klassen einen Copy-Konstruktor, einen Zuweisungsoperator und einen Destruktor. Ich würde dir raten bei jeder Klasse, die du machst als erstes diese 3 Funkionen zu schreiben.

littlejam
2004-09-20, 13:11:12
class X {
public:
int a;
X::X();
};

X::X(){a=1;}


Deine Konstruktorinitialisierung ist auch ungünstig.

Besser so:
class X {
public:
int a;
X::X();
};

X::X():a(1){}

Brillus
2004-09-20, 13:55:24
@littleJam ich arbeite zwar schon etwas länger mit C++ habe aber das wie dus gemacht hast noch nie gesehen wo liegt den der Vorteil davon?

Matrix316
2004-09-20, 14:17:08
Nebenbei würde ich auch nicht eine Klasse oder funktion mit nur einem Buchstaben benennen. Das verwirrt irgendwie nur. ;)

Trap
2004-09-20, 15:13:39
@Brillus:
Das nennt sich Initialisierungsliste. Schlag mal nach was es bringt, eigentlich nur Vorteile.

littlejam
2004-09-20, 15:28:03
@Brillus:
einfaches Beispiel


class X {
public:
const int a;
X::X(int i);
};

X::X(int i):a(i){} // Initialisierung
//X::X(int i){a=i;} // Zuweisung


Der auskommentierte Kostruktor geht nicht, weil a const ist.

Gruß

maximAL
2004-09-20, 18:08:16
class X
{public:
int a;
X::X();
};
:confused:
wusst nichtmal, dass das kompilieren würde, aber standard um den konstruktor zu deklarieren ist wohl eher:
class X
{public:
int a;
X();
};

littlejam
2004-09-20, 22:15:02
;D
Und ich Depp kopier den Fehler auch noch.
Kompilieren tut der GCC aber ohne murren :| warum auch immer.

Gruß