Werbung

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[C++] Das PIMPL-Prinzip 2015-03-24

Interface und Implementation trennen mit PIMPL

  1. -AB-

    -AB- Well-Known Member c-b Team

    -AB- hat eine neue Ressource erstellt:

    [C++] Das PIMPL-Prinzip - Interface und Implementation trennen mit PIMPL

    Weitere Informationen zu dieser Ressource...
  2. coding-board

    coding-board Member

    Werbung
  3. German

    German Well-Known Member c-b Experte

    Ich hatte dank deiner Hilfe schon das Vergnügen mit PIMPL.
    Bei mir war es das Problem, Namenskonflikte zu vermeiden. Ich wollte, dass die Windows-Header im Code out of scope sind. Folgender One-Liner gäbe mit Visual Studio kompiliert einen Fehler:
    Code (C++):
    Quelltext kopieren
    1. #include <windows.h>
    2. #include <iostream>
    3. #include <algorithm>
    4.  
    5. int main()
    6. {
    7.   std::cout << std::max(2, 3) << std::endl;
    8. }
    9.  
    error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
    Das max Macro aus den Windows Headern beißt sich mit dem std::max aus <algorithm>. PIMPL hilft hier, wenn man die Klasse, die die Windows Header benötigt, per Pointer einbindet...
    So weit also äußerst hilfreich.

    Nun habe ich hier aber bei einer deiner Aussagen ein Verständnisproblem.
    :confused:
    Wenn du dein Programm quelloffen auslieferst, dann mit der 3rd Party Lib. Anderenfalls wäre der Code nicht kompilierbar, oder?
    Wenn du kompilierten Code auslieferst, sorgt der Linker dafür, dass auch der Code aus anderen Übersetzungseinheiten im Programm landet.
    Wie muss ich das verstehen?
  4. -AB-

    -AB- Well-Known Member c-b Team

    Wobei bei dir ja nicht das Problem war, Funktionen, die den Windows-Header benötigen, in einer einzelnen .cpp abzulegen, sondern dass du eine Klasse haben wolltest, in der man Windows.h-spezifische Datentypen als Member halten kann (wenn ich mich richtig erinnere). Sonst hättest du kein PIMPL gebraucht ;)

    Klar, wenn ich Quellcode (.cpp und Header) ausliefere, muss der 3rd Party Code auf jeden Fall mit. (Oder zumindest ein Hinweis darauf, mit welcher Lib und welcher Version derselben der Code gebaut werden soll.)

    Den Quellcode mit auszuliefern ist aber im kommerziellen Bereich doch eher unüblich. Stattdessen liefere ich mit einer (dynamisch oder statisch linkbaren) Bibliothek meinen Code binär aus - aber beim Kunden würde der Compiler erstmal einen "XXX ist nicht deklariert"-Fehler werfen, bevor der Linker irgendetwas verbinden kann. Dafür liefere ich noch die entsprechenden Header-Dateien mit, in denen die verwendbaren Klassen und Funktionen deklariert sind. Jetzt kann der Linker nach Entsprechungen im Kompilat suchen. (Ist vielleicht auch einen kurzen Eintrag wert - aber nach sowas hat bisher noch niemand nachgefragt...)
  5. German

    German Well-Known Member c-b Experte

    Genau. Dazu musste aber windows.h im Header includiert werden. Dass ich in meinem Code keine Namenskonflikte zu erwarten hatte, wusste ich. Allerdings kann ich nicht wissen was der Benutzer der Lib in seinem Code stehen hat.

    Damit habe ich mich noch nicht beschäftigt (habe es allerdings vor). Das Prinzip ist mir natürlich bekannt.
    However. Jetzt macht das natürlich mehr Sinn. Unabhängig davon lieferst du den Code aber trotzdem mit, wenn auch kompiliert. Man könnte deine Aussage bspw. als Hintertür missdeuten, geschützten 3rd Party Code zu verwursten, weil er ja "nicht mit ausgeliefert" wird. Ist aber nicht so.
  6. -AB-

    -AB- Well-Known Member c-b Team

    Klar, irgendwie muss der Code mit, sonst kann er nicht ausgeführt werden.
    Allerdings tauchen (je nach Einstellungen und ob statisch/dynamisch) nicht alle Symbole zum Linken auf, unter Windows/VC zum Beispiel nur solche, die mit __declspec(dllexport) versehen sind. Alle anderen Funktionen/Klassen können dann auch mit Header (den man ja quasi selbst schreiben könnte, wenn man das Disassembly versteht) nicht benutzt werden. Überhaupt können die dann natürlich auch vom Compiler u.U. komplett ge-inlined werden - auch mit dem Disassember findet man dann keine Spur mehr.

    Lizensierter 3rd Party Code ließe sich also tatsächlich ohne Probleme (wenn das erlaubt ist, natürlich) als Kompilat ausliefern, weil der Code eben nicht mehr rekonstruierbar ist.
  7. German

    German Well-Known Member c-b Experte

    Hmm, verstehe. Dass nicht für alles ein Name Mangling stattfindet, ist mir natürlich schon aufgefallen (um das heraus zu finden reicht ein Texteditor). Aber, wie gesagt, ich habe mich noch nicht genauer damit beschäftigt...
Die Seite wird geladen...
Ähnliche Themen - [C++] PIMPL Prinzip Forum Datum
[C++] Webseiten Inhalt über Socket empfangen C/C++ 24. Juli 2017
[C++] Nummernformat ändern Ressourcen Diskussionen 15. Januar 2017
[C++] Funktion - Templatisierung ohne Überladung/Spezialisierung? C/C++ 20. November 2016
[C++] GetInput Funktionstemplate - Auf Benutzereingabe warten und in spezifizierten Typ konvertieren Ressourcen Diskussionen 15. März 2016
[C++] Multithreading? Einfache Erklärung C/C++ 28. November 2015