Referenz in Klasse

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Psycho
Establishment
Beiträge: 156
Registriert: 16.09.2002, 14:23

Referenz in Klasse

Beitrag 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());
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Referenz in Klasse

Beitrag 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)
    { ... }

};
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Re: Referenz in Klasse

Beitrag 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)
Virus
Beiträge: 38
Registriert: 20.09.2002, 17:28
Kontaktdaten:

Re: Referenz in Klasse

Beitrag 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.
Antworten