Frage

Ich versuche, eine Reihe von Header-Datei „enthält Spaghetti“ zu vereinfachen, indem Vorwärtsdeklarationen verwendet und #includes in die Implementierungsdatei zu bewegen. Allerdings habe ich immer auf das folgende Szenario kommen:

//Foo.h
#include "Bar.h"

class Foo
{
public:
  void someMethod(Bar::someType_t &val);
};

//Bar.h
.
.
.
class Bar
{
public:
  typedef std::vector<SomeClass> someType_t;
};

Ich möchte #include „bar.h“ in so viele Fälle wie möglich entfernen. Ich sehe auch die Situation, in der typedef in bar.h außerhalb der Bar-Klasse aufgeführt. Ich gehe davon aus können beide Situationen in der gleichen Weise behandelt werden.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Du hast leider nicht viele Möglichkeiten und keine ist perfekt.

Zunächst werden die beiden offensichtlich und nicht akzeptabel Lösungen:

  • Sie können weiterleiten die typedef erklären, die völlig verfehlt den Zweck, eine typedef zu verwenden.
  • Sie schließen die Datei, die die typedef enthält, die Sie vermeiden möchten.

Die interessanteren Lösungen:

  • Haben Sie alle damit verbundenen typedefs in derselben enthalten und umfassen diese Datei. Dies schafft Code Kopplung zwischen den Klassen though. Sie sollen sie, dass nur mit verwandten Klassen tun, was Sie mit einem Gott am Ende gehen zu Include-Datei und diese zu viel neu zu kompilieren führen könnte, wenn Sie eine typedef zu dieser Datei hinzufügen.
  • Für jede Klasse hat eine separate mit dem typedefs darin enthalten. Art ärgerlich, aber es funktioniert.

Die letzten beiden sind wie vorwärts Erklärungen zu tun, sondern mit zusätzlichen typedefs. Sie reduzieren die Datei Interdependenzen, da Sie selten die typedef-Datei zu ändern.

würde ich für die meisten Situationen sagen, die zentrale umfassen den größten Nutzen für Ärger hat. Nur vorsichtig sein.

Andere Tipps

Just class Bar; verwenden. Das sagt C ++ Sie Ihre Absicht, sind erklärt Bar zu definieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top