Frage

PIMPLs sind eine Quelle von Boilerplate in vielen C ++ - Code. Sie scheinen die Art von Dingen zu sein, dass eine Kombination aus Makros, Vorlagen und vielleicht eine kleine externe Werkzeughilfe lösen könnte, aber ich bin mir nicht sicher, was der einfachste Weg sein würde. Ich habe Vorlagen gesehen Das hilft, einige der Heben zu tun, aber nicht viel - Sie müssen immer noch weiterleitende Funktionen für jede Methode der Klasse schreiben, die Sie einwickeln möchten. Gibt es einen einfacheren Weg?

Ich stelle mir ein Tool vor, das als Teil des Verfahrens verwendet wird. Sie möchten, dass Ihre öffentlichen Header Pimpl'd-Klassen sind, sodass Sie eine Eingabedatei angeben, beispielsweise Pimpl.in, die die Klassen (implementierte unpimpl'd) auflistet, die Sie einwickeln möchten, und diese Datei wird untersucht. Die PimPL -Klassen werden generiert und nur ihre Header (nicht die Header der Originalklasse) werden während einer "Installation" installiert. Das Problem ist, dass ich keine Möglichkeit sehe, dies ohne einen vollständigen C ++ - Parser zu tun, was auch Compiler -Anbieter nicht richtig machen können. Vielleicht könnten die Klassen auf eine andere Weise geschrieben werden, was die Aufgabe eines externen Tools erleichtert, aber ich bin sicher, dass ich alle möglichen Eckfälle (z. B. Vorlagenklassen und/oder Vorlagenfunktionen) verpassen würde.

Irgendwelche Ideen? Hat noch jemand eine Lösung für dieses Problem?

War es hilfreich?

Lösung

Nein, es gibt keine einfache Antwort. :-( Ich würde mit fast jedem OO-Experten denken, dass "Komposition über Erbschaft bevorzugt", es würde Sprachunterstützung dafür geben, Komposition viel einfacher zu machen als Erbschaft.

Andere Tipps

Ich sage nicht, dass dies gut ist (nur etwas, das mir in den Sinn kam).
Aber Sie könnten mit der Überlastung des Operators experimentieren ->

#include <memory>
#include <iostream>

class X
{
    public:
    void plop()
    {
        std::cout << "Plop\n";
    }
};

class PimplX
{
    public:
        PimplX()
        {
            pimpl.reset(new X);
        }
        X* operator->()
        {
            return pimpl.get();
        }
    private:
        PimplX(PimplX const&);
        PimplX& operator=(PimplX const&);
        std::auto_ptr<X>    pimpl;
};   


int main()
{    
    PimplX      x;

    x->plop();
}

Eine Option besteht darin, stattdessen eine Schnittstellenklasse zu verwenden:

class ClassA {
  virtual void foo() = 0;
  static ClassA *create();
};

// in ClassA.cpp

class ImplA : public ClassA {
/* ... */
};
ClassA *ClassA::create() {
  return new ImplA();
}

Dies fügt jedoch Overhead aus dem Abholen der Vtable -Funktionszeiger hinzu.

Davon abgesehen kann ich mir kein solches Tool vorstellen. Wie Sie sagten, ist das Parsen C ++ nicht trivial, und es gibt noch andere Sprachen, in denen es weniger ein Problem gibt (z. B. C# oder Java späte alles, sodass Sie das In-Memory-Layout später ohne Probleme ändern können).

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