PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Klasse B an A "übergeben"


Gast
2006-01-14, 17:44:27
Wie kann ich an eine Klasse A eine Instanz von Klasse B "übergeben", die schon ausserhalb von A definiert wurde? Ich verstehe das nämlich nicht. :/


A::A(B &b) // Konstruktor von A
{
'this'.b = b // <-- Java-like?!.
}

Matrix316
2006-01-14, 17:52:03
Stichwort: Template

Ich weiß nicht genau wie, aber ich glaube ziemlich sicher, dass man das dafür nimmt. ;)

EDIT: Allerding bin ich nicht ganz sicher. ;)

EDIT2: Müsste aber doch gehen.

template <class b>
class a {
a()
{
this = b;
}
}

Oder? :confused: (ohne Gewähr ;))

Oder meinst du einfach vererben/ableiten von wegen:

class a : class b {
blablabla
}
:confused:

Coda
2006-01-14, 17:57:48
Kannst du mal genauer beschreiben was du willst, ich versteh deine Frage gar nicht genau.

Gast
2006-01-14, 18:11:17
Also, ganz grob:
Ich habe eine Leser-Klasse, einen Datenbank-Klasse und eine Schreiber-Klasse.
In Main ist je ein Objekt dieser Klassen erstellt worden, zB Objekt L der Leser-Klasse, D der Datenbank-Klasse und S der Schreiber-Klasse.

In L wird irgendwas gelesen (Dateien, was von der Konsole, etc), was dann in der Datenbank D abgelegt werden soll.
Beim Erzeugen von L will ich aber ein bereits vorhandenes D an L übergeben, damit dieses D von diesem L gefüllt wird.
(Man könnte ja auch ein anderes "D2" übergeben).

Quasi:
'erzeuge Objekt D'
'erzeuge Objekt L(D)'
'L.lese' // L liest und legt gelesenes in D ab
'erzeuge Objekt S(D)' // schreibe was du in D vorfindest

Coda
2006-01-14, 18:14:12
Ach so.

A::A(B &b) : b(b)
{
...
}

Gast
2006-01-14, 18:53:15
Örks...

Wie würde dann das Erzeugen eines A-Objekts aussehen?

Coda
2006-01-14, 19:12:24
A a(b);

http://tutorial.schornboeck.net/initliste.htm

Gast
2006-01-14, 19:21:24
http://tutorial.schornboeck.net/initliste.htm
Ja, aber das ist auch gerade das, was ich nicht verstehe. ;-)


class Klasse
{
private:
int& r;
int const c;
public:
Klasse(int i)
: r(i), c(i)
{
}
};


Was bringt mir ein Konstruktor, bei dem einint i übergeben wird, wenn ich doch zwei Variablen r und c initialisieren will.

Was ist r(i) bzw c(i)?!
Ist r == c in diesem Falle hier, oder was?
Wie initalisiere ich r (zB) mit 5 und c mit 2?!

Coda
2006-01-14, 19:32:53
r(5), c(2)

Die Initialisierungsliste enthält Konstruktoraufrufe der jeweiligen Datentypen.

Gast
2006-01-14, 19:40:51
Aha. oO

Wenn ich also ein Objekt der Klasse 'Klasse' erzeugen möchte und r und c mit verschiedenen Werten initialisiert werden sollen, muss ich einen neuen Konstruktor schreiben?


Klasse(int i, int k)
: r(i), c(k)

Coda
2006-01-14, 19:45:27
Ja. Die Namen können dabei übrigens gleich sein. Also z.B:

class A
{
public:
A(int i) : i(i) {}
private:
int i;
}wird i korrekt initialisieren.

zeckensack
2006-01-16, 00:51:49
Mal abgesehen davon dass Coda die IMO elegantere (und potentiell effizientere) Lösung schon gegeben hat (die Konstruktion heißt "Präambel" btw) ...Wie kann ich an eine Klasse A eine Instanz von Klasse B "übergeben", die schon ausserhalb von A definiert wurde? Ich verstehe das nämlich nicht. :/


A::A(B &b) // Konstruktor von A
{
'this'.b = b // <-- Java-like?!.
}Die Idee ist richtig, aber die Syntax ist falsch. In C++ ist this ein Zeiger, und man braucht ergo den Dereferenzierungsoperator "*" um auf das Objekt selbst zuzugreifen, und die Member-Derefernzierung "->" für den Zugriff auf Elemente der Klasse.

class B;

class
A
{
public:
A(B& b);
private:
B b;
};#include "A.h"

A::A(B& b)
{
this->b=b;
}Der Tanz ist im übrigen nur deswegen nötig, weil der Parameter den gleichen Namen hat wie das Element der Klasse. Der Compiler gibt dem Parameter den Vorrang. Wenn man an das gleichnamige Klassenelement möchte, das vom Parameter "überdeckt" wird, muss dies dann genau qualifiziert werden (eben über this->b).
Gibt man dagegen dem Konstruktor-Parameter oder dem Klassenelement einen anderen Namen, kann "this->..." entfallen.#include "A.h"

A::A(B& some_b)
{
b=some_b;
}

PS: es ist guter Stil in solchen Fällen "const B&" zu benutzen. Ein Objekt das man zum Kopieren übergeben bekommtl braucht nicht änderbar zu sein, und der Compiler kann dann Operationen die B ändern könnten korrekt als Fehler erkennen. Bei der Initialisierung von A::b kommt ohnehin der "copy constructor" von B zum Zuge, und auch dieser sollte, falls man ihn selbst schreibt, so aussehen:B::B(const B& rhs)
{
some_member=rhs.some_member;
...
}

Gast
2006-01-19, 11:50:14
Ui!
Aus Dankbarkeit habe ich euch allen gerade einen dicken Schmatzer auf die linke Pobacke gedrückt. =)