Seite 1 von 1

Referenz in Klasse

Verfasst: 09.12.2009, 00:13
von Psycho
Hallo,

ich hab folgende Klassen

Code: Alles auswählen

class A;

class B
{
  private:
    A& m_a;
  public:
    B(A &a) : m_a(a) {}
};
die möchte ich am liebsten so aufrufen:

Code: Alles auswählen

B meinB(A());
das problem ist jetzt, dass das objekt der klasse A ja sofort wieder zerstört wird, nachdem der konstruktor von B aufgerufen wurde.
eigentlich möchte ich mit dem B etwas weiterarbeiten, und das A soll bei der zerstörung von meinB mit zerstört werden.
ich möchte auch vermeiden, dass das A-objekt kopiert werden muss.

es ginge wohl mit nem shared_ptr von boost. ginge es auch ohne?

wie verhält es sich hiermit, ist es ok new und delete voneinander zu trennen?

Code: Alles auswählen

class A;

class B
{
  private:
    A *m_a;
  public:
    B(A *a) { m_a = a; }
    ~B() { delete m_a; }
};

// Aufruf dann so:
B meinB(new A());

Re: Referenz in Klasse

Verfasst: 09.12.2009, 00:30
von Krishty
Wenn das A nur den Zweck hat, während der Lebenszeit von B eben diesem zur Verfügung zu stehen, warum nicht die Parameter für As K’tor Bs K‘tor übergeben und eine Instanz von A zu einem Member Bs machen, die mit den Parametern aus Bs K‘tor gefüttert wird?

Ein Objekt ist entweder komplett verantwortlich für ein anderes, oder garnicht. Ein Objekt ein anderes zerstören zu lassen, welches es nicht geschaffen hat, ist selten sinnvoll.

Gruß, Ky

Code: Alles auswählen

class A {
public:
    A(ParameterA);
};

class B {
private:
    A m_a;

public:
    B(ParameterA, ParameterB)
        : m_a(ParameterA)
    { ... }

};

Re: Referenz in Klasse

Verfasst: 09.12.2009, 14:48
von Biolunar
Sehe ich genau wie Krishty. Auf so ein new/delete Konstrukt würde ich mich erst gar nicht einlassen, das führt viel zu oft zu Fehlern... Die Variante mit dem boost::shared_ptr ist grundsätzlich eine gute Idee, aber da du das Sub-Objekt ja im Konstruktor erst erstellen willst, solltest du keine Smart Pointer verwenden, wenn dein Code Exceptions werfen kann. (Siehe Doku)

Re: Referenz in Klasse

Verfasst: 09.12.2009, 18:41
von Virus
Krishtys Lösung funktioniert aber auch nur, wenn A wenige Parameter benötigt (und B auch) - weil Metoden mit mehr als 3 Parameter eher als schlechter Stil gelten.
Umgehen könnte man das mit Buildern.