<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich hatte letzte Woche einen betrieblichen Kurs über Java-OOP und mir sind da einige Fragen betreffend Library Design in C++ aufgekommen.</p>
<p>Zuerst was mir im Java-Kurs auffiel:<br />
- Java bietet package protected an, was eine Verwendung einer Klasse ausserhalb des Packages verunmöglicht<br />
- Die Hautpklasse der Library wird als Singleton mir einer Factory verwendet<br />
- Für jedes Businessobjekt, dass ausserhalb der Bibliothek verwendet wird, gibt es ein Interface. Die eigentliche Businessklasse wird dann auf package protected gesetzt<br />
- Sind mehrere Businessobjekte ähnlich, wird eine abstrakte Klasse geschrieben, welche über ein Interface verwendbar ist. Businessobjekte sind von der abstrakten Klasse abgeleitet (und Package protected, da das Interface öffentlich ist)<br />
- Verschiedene Businessobjekte verweden über verschiedene create Methoden in der Factory erstellt, zB Factory.createFoo() erstellt intern ein Foo Objekt, liefert aber ein Interface Objekt zurück</p>
<p>Nun, mit diese Erkenntnisen ging ich heim und es entstanden in meinem Kopf diverse Fragen, da ich momentan selber plane, eine C++ Shared Libary zu schreiben:<br />
- Wenn ich mir Tutorials über Shared Libraries anschaue sehe ich nie Interfaces ? Warum ? Verlässt man sich immer auf Compiler Attribute zum exportieren der Klasse ? Schlussendlich muss man ohne Interface trotzdem die ganze Businessklasse exportieren, um sie verwenden zu können ?<br />
- Als nachfolgende Frage auf Frage 1: Ist es üblich, ein öffentliches/zu exportierendes Interface zu schreiben und die Libraryklasse innerhalb der Library zu hidden oder handelt es sich hier wirklich um eine Java Lösung?<br />
- Kennt jemand ein Beispiel, wie man richtige Shared Libraries mit Businessobjekten schreibt (Welche dann vielleicht auch gleich meine gesamten Fragen beantwortet)<br />
- Eine Interfaces Klasse mit virtuellen Methoden ist ja im eigentlichen Sinne unfähig, ein Objekt zu instanzieren</p>
<p>In meinem Kopf hat sich dann folgendes Schema aufgebaut, um eine C++ Shared Library zu entwickeln:<br />
- SharedLibraryFactory: Singleton-Klasse mit Factory, um intern ObjectFoo und ObjectBar zu erstellen, ObjectInterface wird bei beiden zurückgeliefert. Wird exportiert<br />
- ObjectInterface: Interface für die Objekte. Wird exportiert<br />
- ObjectFoo: Businessklasse Foo, abgeleitet von ObjectInterface. Wird nicht exportiert<br />
- ObjectBar: Businessklasse Bar, abgeleitet von ObjectInterface. Wird nicht exportiert</p>
<p>Liege ich mit dieser Überlegung richtig ? Ich möchte noch anfügen, dass ich die Library zur Compilezeit dazulinke, sprich ich sie nicht mit dlopen/LoadLibrary dynamisch laden &amp; resolven muss.</p>
<p>Freundliche Grüsse,<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322496/grundlegende-fragen-über-das-design-einer-shared-library-in-c-mit-java-im-hinterkopf</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 03:21:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322496.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Dec 2013 15:55:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Mon, 23 Dec 2013 15:55:01 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich hatte letzte Woche einen betrieblichen Kurs über Java-OOP und mir sind da einige Fragen betreffend Library Design in C++ aufgekommen.</p>
<p>Zuerst was mir im Java-Kurs auffiel:<br />
- Java bietet package protected an, was eine Verwendung einer Klasse ausserhalb des Packages verunmöglicht<br />
- Die Hautpklasse der Library wird als Singleton mir einer Factory verwendet<br />
- Für jedes Businessobjekt, dass ausserhalb der Bibliothek verwendet wird, gibt es ein Interface. Die eigentliche Businessklasse wird dann auf package protected gesetzt<br />
- Sind mehrere Businessobjekte ähnlich, wird eine abstrakte Klasse geschrieben, welche über ein Interface verwendbar ist. Businessobjekte sind von der abstrakten Klasse abgeleitet (und Package protected, da das Interface öffentlich ist)<br />
- Verschiedene Businessobjekte verweden über verschiedene create Methoden in der Factory erstellt, zB Factory.createFoo() erstellt intern ein Foo Objekt, liefert aber ein Interface Objekt zurück</p>
<p>Nun, mit diese Erkenntnisen ging ich heim und es entstanden in meinem Kopf diverse Fragen, da ich momentan selber plane, eine C++ Shared Libary zu schreiben:<br />
- Wenn ich mir Tutorials über Shared Libraries anschaue sehe ich nie Interfaces ? Warum ? Verlässt man sich immer auf Compiler Attribute zum exportieren der Klasse ? Schlussendlich muss man ohne Interface trotzdem die ganze Businessklasse exportieren, um sie verwenden zu können ?<br />
- Als nachfolgende Frage auf Frage 1: Ist es üblich, ein öffentliches/zu exportierendes Interface zu schreiben und die Libraryklasse innerhalb der Library zu hidden oder handelt es sich hier wirklich um eine Java Lösung?<br />
- Kennt jemand ein Beispiel, wie man richtige Shared Libraries mit Businessobjekten schreibt (Welche dann vielleicht auch gleich meine gesamten Fragen beantwortet)<br />
- Eine Interfaces Klasse mit virtuellen Methoden ist ja im eigentlichen Sinne unfähig, ein Objekt zu instanzieren</p>
<p>In meinem Kopf hat sich dann folgendes Schema aufgebaut, um eine C++ Shared Library zu entwickeln:<br />
- SharedLibraryFactory: Singleton-Klasse mit Factory, um intern ObjectFoo und ObjectBar zu erstellen, ObjectInterface wird bei beiden zurückgeliefert. Wird exportiert<br />
- ObjectInterface: Interface für die Objekte. Wird exportiert<br />
- ObjectFoo: Businessklasse Foo, abgeleitet von ObjectInterface. Wird nicht exportiert<br />
- ObjectBar: Businessklasse Bar, abgeleitet von ObjectInterface. Wird nicht exportiert</p>
<p>Liege ich mit dieser Überlegung richtig ? Ich möchte noch anfügen, dass ich die Library zur Compilezeit dazulinke, sprich ich sie nicht mit dlopen/LoadLibrary dynamisch laden &amp; resolven muss.</p>
<p>Freundliche Grüsse,<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373411</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Mon, 23 Dec 2013 15:55:01 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Mon, 23 Dec 2013 16:05:04 GMT]]></title><description><![CDATA[<p>swaechter schrieb:</p>
<blockquote>
<p>In meinem Kopf hat sich dann folgendes Schema aufgebaut, um eine C++ Shared Library zu entwickeln:<br />
- SharedLibraryFactory: Singleton-Klasse mit Factory, um intern ObjectFoo und ObjectBar zu erstellen, ObjectInterface wird bei beiden zurückgeliefert. Wird exportiert<br />
- ObjectInterface: Interface für die Objekte. Wird exportiert<br />
- ObjectFoo: Businessklasse Foo, abgeleitet von ObjectInterface. Wird nicht exportiert<br />
- ObjectBar: Businessklasse Bar, abgeleitet von ObjectInterface. Wird nicht exportiert</p>
</blockquote>
<p>Wenn du es so umsetzt, dann nimm Java oder C#. Du wirst dich bald über fehlende Reflection aufregen und mit korruptem Speicher zu kämpfen haben.</p>
<p>In C++ macht das so jedenfalls keinen Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373416</guid><dc:creator><![CDATA[executor.execute()]]></dc:creator><pubDate>Mon, 23 Dec 2013 16:05:04 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Mon, 23 Dec 2013 16:09:11 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Nein, ich möchte nicht auf Java/C# wechseln, da ich gewisse C++ Frameworks verwende. Mir geht es darum zu wissen, wie man eine saubere Shared Library schreibt, welche Businessobjekte mit dem Verwender austauscht, ohne dass dieser Zugriff auf die komplette Implementierung hat und mit dieser Unfug anstellen könnte (Zum Beispiel eigene Objekte erstellen, ohne diese per Factory erstellen zu lassen).</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373418</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Mon, 23 Dec 2013 16:09:11 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Mon, 23 Dec 2013 16:31:56 GMT]]></title><description><![CDATA[<p>swaechter schrieb:</p>
<blockquote>
<p>- Java bietet package protected an, was eine Verwendung einer Klasse ausserhalb des Packages verunmöglicht</p>
</blockquote>
<p>C++ kennt keine Packages.</p>
<p>swaechter schrieb:</p>
<blockquote>
<p>- Die Hautpklasse der Library wird als Singleton [...]</p>
</blockquote>
<p>pfui, Finger weg von Singleton. Auch wenn dies möglicherweise einer der extrem seltenen Fälle ist, wo man zumindest ein wenig argumentieren könnte, dass Singleton nicht zu 100% völlig daneben ist...</p>
<p>swaechter schrieb:</p>
<blockquote>
<p>- Wenn ich mir Tutorials über Shared Libraries anschaue sehe ich nie Interfaces ? Warum ? Verlässt man sich immer auf Compiler Attribute zum exportieren der Klasse ? Schlussendlich muss man ohne Interface trotzdem die ganze Businessklasse exportieren, um sie verwenden zu können ?</p>
</blockquote>
<p>C++ kennt weder Shared Libraries, noch ein portables Objektlayout. Klassen in eine Shared Library exportieren, ist ein völlig compiler- und plattformspezifisches Feature. Deine Library funktioniert dann nur unter ganz bestimmten Umständen mit genau diesem einen Compiler auf genau dieser einen Plattform. Wenn man mehr will als das, muss man sich auf den entsprechenden kleinsten gemeinsamen Nenner beschränken, was in der Regel auf ein prozedurales Interface (C-Style) rausläuft.</p>
<p>swaechter schrieb:</p>
<blockquote>
<p>- Eine Interfaces Klasse mit virtuellen Methoden ist ja im eigentlichen Sinne unfähig, ein Objekt zu instanzieren</p>
</blockquote>
<p>Du kannst auch in Java keine Interfaces instanzieren...</p>
<p>swaechter schrieb:</p>
<blockquote>
<p>In meinem Kopf hat sich dann folgendes Schema aufgebaut, um eine C++ Shared Library zu entwickeln:<br />
- SharedLibraryFactory: Singleton-Klasse mit Factory, um intern ObjectFoo und ObjectBar zu erstellen, ObjectInterface wird bei beiden zurückgeliefert. Wird exportiert<br />
- ObjectInterface: Interface für die Objekte. Wird exportiert<br />
- ObjectFoo: Businessklasse Foo, abgeleitet von ObjectInterface. Wird nicht exportiert<br />
- ObjectBar: Businessklasse Bar, abgeleitet von ObjectInterface. Wird nicht exportiert</p>
<p>Liege ich mit dieser Überlegung richtig ? Ich möchte noch anfügen, dass ich die Library zur Compilezeit dazulinke, sprich ich sie nicht mit dlopen/LoadLibrary dynamisch laden &amp; resolven muss.</p>
</blockquote>
<p>Das geht schon in eine nicht ganz so falsche Richtung. Rein virtuelle Interface Klassen an dll Grenzen sind ein für viele Anwendungen brauchbarer Kompromiss (Dinge wie z.B. STL Container gehören aber nicht in das Interface). Wenn du sowieso statisch bindest, kannst du aber auch das ganze Klassen exportieren Zeug machen, man muss nur ein wenig aufpassen dabei. Ansonsten gibt es unter Windows z.B. auch COM, das wäre die ganz proper solution.</p>
<p>Auch wenn beide geschwungene Klammern verwenden: C++ ist nicht Java. Die beiden Sprachen sind extrem unterschiedlich. Ich würde empfehlen, dich erstmal von Grund auf tiefgehend mit C++ zu beschäftigen, ansonsten wirst du sehr wahrscheinlich einfach nur in C++ Java coden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373423</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 23 Dec 2013 16:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Mon, 23 Dec 2013 16:32:02 GMT]]></title><description><![CDATA[<p>In C++ schreibt man zwei Klassen ObjectFoo und ObjectBar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373424</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 23 Dec 2013 16:32:02 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Mon, 23 Dec 2013 18:53:15 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>In C++ schreibt man zwei Klassen ObjectFoo und ObjectBar.</p>
</blockquote>
<p>Leider bleiben damit folgende Fragen unbeantwortet:<br />
- Wie schützte ich ObjectFoo und ObjectBar vor einer Instanzierung durch den Benutzer. Beide Klassen sollten nur durch eine Helperklasse (In diesem Fall die Factory) erstellbar sein, ansonsten können die Klassen missbraucht werden. ObjectFoo und ObjectBar sind wirklich reine Businessobjekte, sprich enthalten Daten und nicht wirklich Logik. Folglich möchte ich diese Objekte nur durch die Faktory verändern lassen (welche die Eingabe/Veränderung dann auch prüft)<br />
- Was hide und was exportiere ich ? Ich möchte die Implementierung/Logik ja nicht exportieren, sondern nur die Schnittstelle</p>
<p>dot schrieb:</p>
<blockquote>
<p>Auch wenn beide geschwungene Klammern verwenden: C++ ist nicht Java. Die beiden Sprachen sind extrem unterschiedlich. Ich würde empfehlen, dich erstmal von Grund auf tiefgehend mit C++ zu beschäftigen, ansonsten wirst du sehr wahrscheinlich einfach nur in C++ Java coden...</p>
</blockquote>
<p>Den Gedanken habe ich auch oft. Mein Problem ist, dass ich eigentlich mit Qt zu C++ gekommen bin und nie wirklich mit C/C++, Hello World (Respektive Grundlegenden Sachen) als &quot;Vanilla&quot; angefangen habe. Es fällt mir jetzt recht schwer, wieder ohne Qt auszukommen, da mir dieses Framework einfach soviele praktische Features offeriert</p>
<p>dot schrieb:</p>
<blockquote>
<p>pfui, Finger weg von Singleton. Auch wenn dies möglicherweise einer der extrem seltenen Fälle ist, wo man zumindest ein wenig argumentieren könnte, dass Singleton nicht zu 100% völlig daneben ist...</p>
</blockquote>
<p>Geb ich dir vollkommen Recht. Ist jetzt rausgeworfen. Klasse wird einmal instanziert.</p>
<p>dot schrieb:</p>
<blockquote>
<p>Ansonsten gibt es unter Windows z.B. auch COM, das wäre die ganz proper solution.</p>
</blockquote>
<p>Kann ich leider nicht verwenden, ich möchte den Sourcecode plattformunabhängig halten. Darum verwende ich auch Frameworks (Unter anderem wie gesagt Qt). Defines für MSVC/gcc/clang exports wie cdecl oder atribute gehen aber vollkommen ok und gehören halt einfach dazu</p>
<p>Betreffend Factory/Interface/Export bin ich jetzt bei sowas gelandet (Was denke ich deiner Vorstellung entspricht ?). <strong>Jedenfalls funktioniert die LIBRARY_PRIVATE noch nicht</strong> - Defines für die Library wird gesetzt, bei der Applikation wird es weggelassen - soweit sollte es also hin kommen ?. Ich bin mir auch noch nicht ganz sicher ob das betreffend Vererbung überhaupt möglich ist:</p>
<p>main.cpp</p>
<pre><code>#include &lt;iostream&gt;

#include &quot;library/ObjectExport.h&quot;
#include &quot;library/ObjectFactory.h&quot;
#include &quot;library/ObjectInterface.h&quot;

int main(void)
{
	// Arbeitet wie gewünscht/gedacht
	ObjectFactory *factory = new ObjectFactory();
	ObjectInterface *objectfoo = factory-&gt;createFoo();
	ObjectInterface *objectbar = factory-&gt;createBar();

	std::cout &lt;&lt; &quot;Factory:&quot; &lt;&lt; factory-&gt;getNumberAsCheck() &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;ObjectFoo:&quot; &lt;&lt; objectfoo-&gt;getNumber() &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;ObjectBar:&quot; &lt;&lt; objectbar-&gt;getNumber() &lt;&lt; std::endl;

	delete objectfoo;
	delete objectbar;
	delete factory;

	// Dieses Szenarie gilt es zu verhindern (Funktioniert aber noch ...)
	ObjectFoo *abusedobject = new ObjectFoo();
	std::cout &lt;&lt; &quot;AbusedObject:&quot; &lt;&lt; abusedobject-&gt;getNumber() &lt;&lt; std::endl;
	delete abusedobject;

	return 0;
};
</code></pre>
<p>ObjectFactory.h</p>
<pre><code>#ifndef OBJECTFACTORY_H
#define OBJECTFACTORY_H

#include &quot;ObjectExport.h&quot;
#include &quot;ObjectInterface.h&quot;
#include &quot;ObjectFoo.h&quot;
#include &quot;ObjectBar.h&quot;

class LIBRARY_EXPORT ObjectFactory
{
public:
	int getNumberAsCheck();
	ObjectInterface *createFoo();
	ObjectInterface *createBar();
};

#endif // OBJECTFACTORY_H
</code></pre>
<p>ObjectFactory.cpp</p>
<pre><code>#include &quot;ObjectFactory.h&quot;

int ObjectFactory::getNumberAsCheck()
{
	return 9001;
}

ObjectInterface *ObjectFactory::createFoo()
{
	return new ObjectFoo();
}

ObjectInterface *ObjectFactory::createBar()
{
	return new ObjectBar();
}
</code></pre>
<p>ObjectInterface.h</p>
<pre><code>#ifndef OBJECTINTERFACE_H
#define OBJECTINTERFACE_H

#include &quot;ObjectExport.h&quot;

class LIBRARY_EXPORT ObjectInterface
{
public:
	virtual int getNumber() = 0;
};

#endif // OBJECTINTERFACE_H
</code></pre>
<p>ObjectFoo.h (ObjectBar.h ist gleich)</p>
<pre><code>#ifndef OBJECTFOO_H
#define OBJECTFOO_H

#include &quot;ObjectExport.h&quot;
#include &quot;ObjectInterface.h&quot;

class LIBRARY_PRIVATE ObjectFoo : public ObjectInterface
{
public:
	int getNumber()
	{
		return 41;
	}
};

#endif // OBJECTFOO_H
</code></pre>
<p>ObjectExport.h (Momentan einfach mal für Linux GCC, Rest kommt wenn der Prototyp funktioniert)</p>
<pre><code>#ifndef OBJECTEXPORT_H
#define OBJECTEXPORT_H

#if defined(COMPILER_GCC)
	#define LIBRARY_EXPORT __attribute__ ((visibility (&quot;default&quot;)))
	#define LIBRARY_PRIVATE __attribute__ ((visibility (&quot;hidden&quot;)))
#else
	#define LIBRARY_EXPORT
	#define LIBRARY_PRIVATE
#endif

#endif // OBJECTEXPORT_H
</code></pre>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373454</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Mon, 23 Dec 2013 18:53:15 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Mon, 23 Dec 2013 18:58:20 GMT]]></title><description><![CDATA[<p>swaechter schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>In C++ schreibt man zwei Klassen ObjectFoo und ObjectBar.</p>
</blockquote>
<p>Leider bleiben damit folgende Fragen unbeantwortet:<br />
- Wie schützte ich ObjectFoo und ObjectBar vor einer Instanzierung durch den Benutzer. Beide Klassen sollten nur durch eine Helperklasse (In diesem Fall die Factory) erstellbar sein, ansonsten können die Klassen missbraucht werden. ObjectFoo und ObjectBar sind wirklich reine Businessobjekte, sprich enthalten Daten und nicht wirklich Logik. Folglich möchte ich diese Objekte nur durch die Faktory verändern lassen (welche die Eingabe/Veränderung dann auch prüft)</p>
</blockquote>
<p>Konstruktoren. Memberfunktionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373457</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 23 Dec 2013 18:58:20 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 00:25:40 GMT]]></title><description><![CDATA[<p>swaechter schrieb:</p>
<blockquote>
<p>- Wie schützte ich ObjectFoo und ObjectBar vor einer Instanzierung durch den Benutzer. Beide Klassen sollten nur durch eine Helperklasse (In diesem Fall die Factory) erstellbar sein, ansonsten können die Klassen missbraucht werden.</p>
</blockquote>
<p>Dann exportier sie einfach nicht. Wenn du sie nicht exportierst und dem User keine Deklaration der Klassen im Header deiner Library lieferst, bekommt der nichtmal mit, dass sie existieren. Überhaupt: Sowas wie Klassen gibt's sowieso nur im Source Code. Die fertig kompilierte Library enthält keinerlei Informationen über irgendwelche &quot;Klassen&quot; oder sonstwas, dort drin gibt's einfach nur einen Haufen Maschinencode.</p>
<p>swaechter schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>Auch wenn beide geschwungene Klammern verwenden: C++ ist nicht Java. Die beiden Sprachen sind extrem unterschiedlich. Ich würde empfehlen, dich erstmal von Grund auf tiefgehend mit C++ zu beschäftigen, ansonsten wirst du sehr wahrscheinlich einfach nur in C++ Java coden...</p>
</blockquote>
<p>Den Gedanken habe ich auch oft. Mein Problem ist, dass ich eigentlich mit Qt zu C++ gekommen bin und nie wirklich mit C/C++, Hello World (Respektive Grundlegenden Sachen) als &quot;Vanilla&quot; angefangen habe. Es fällt mir jetzt recht schwer, wieder ohne Qt auszukommen, da mir dieses Framework einfach soviele praktische Features offeriert</p>
</blockquote>
<p>Nun, der von dir gepostete Code zeig die typischen Symtome: Überall wird new benutzt, sogar roh, alles wird per Referenz herumgereicht. Das ist halt genau, wie man es in Java macht, weil es dort nicht besser geht. Ein C++ Programmierer würde deine ObjectFactory z.B. nicht per new anlegen. Ein lokales Objekt tut's dort genauso. Ansonsten würde man Besitzverhältnisse über std::unique_ptr modellieren, anstatt mit rohen Zeigern und new. Dann spart man sich auch das ganze herumdeleten und alles ist automatisch exception-safe. Das Stichwort dabei lautet RAII und ist wohl eines der mächtigsten Feature von C++ überhaupt.</p>
<p><strong>ACHTUNG</strong>: Vorsicht mit RAII! Wenn du RAII einmal verstanden hast, wirst du diese Welt niemals mehr verlassen wollen, jede andere Sprache wird dir mangels RAII früher oder später auf die Nerven gehen und jeder Kontakt mit Garbage Collection wird dich an den Punkt bringen, wo du dir am liebsten die Augen auskratzen würdest. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373482</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 24 Dec 2013 00:25:40 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 10:28:28 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Dann exportier sie einfach nicht. Wenn du sie nicht exportierst und dem User keine Deklaration der Klassen im Header deiner Library lieferst, bekommt der nichtmal mit, dass sie existieren. Überhaupt: Sowas wie Klassen gibt's sowieso nur im Source Code. Die fertig kompilierte Library enthält keinerlei Informationen über irgendwelche &quot;Klassen&quot; oder sonstwas, dort drin gibt's einfach nur einen Haufen Maschinencode.</p>
</blockquote>
<p>Ok, ich hatte das total falsch im Kopf. Der Datenheader wird dem Verwender ja nicht zur Verfügung gestellt. Soweit also ok</p>
<p>Betreffend RAII &amp; (Smart) Pointern: Ist mir bewusst, aber es handelt sich hier nur um einen Prototypen. Ich sollte in Zukunft aber trotzdem mehr Wert auf Smart Pointers legen (RAII verwende ich wo es nur geht, ich habe einfach Angst, ich sprenge einmal den Stack)</p>
<p>Betreffend der ursprünglichen Frage: Die ist soweit gelöst, da ich auch auf das Thema PIMPL und/vs Abstract Interface gestossen bin. Ich werde die Factoryklasse wahrscheinlich mit dem PIMPL Gedanken realisieren und für die Businessobjekte Interfaces (also abstrakte Interfaces) zurückgeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373500</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Tue, 24 Dec 2013 10:28:28 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 10:51:01 GMT]]></title><description><![CDATA[<p>Ist das zu viel verlangt, einfach die Konstruktoren zur korrekten Erzeugung zu nutzen und via Memberfunktionen die Daten wegzukapseln?<br />
Ganz ohne Factory. Und ohne PIMPL, dessen Sinn und Zweck es eigentlich ist, nicht alle bneötigten Header zu inkludieren.<br />
Und RAII hat keine Nachteile, die den &quot;Stack sprengen könnten&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373502</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 24 Dec 2013 10:51:01 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 11:15:03 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Ist das zu viel verlangt, einfach die Konstruktoren zur korrekten Erzeugung zu nutzen und via Memberfunktionen die Daten wegzukapseln?<br />
Ganz ohne Factory. Und ohne PIMPL, dessen Sinn und Zweck es eigentlich ist, nicht alle bneötigten Header zu inkludieren.<br />
Und RAII hat keine Nachteile, die den &quot;Stack sprengen könnten&quot;.</p>
</blockquote>
<p>Nathan, mir bringt es leider nicht viel, wenn Du sagst: Mach es so, so und so, lass dies und jenes weg. Was mir wichtig ist:<br />
- Warum so und nicht anderst ? Was ist sind deine Beweggründe, dies so zu realiseren ?<br />
- Betreffend Header und exportieren einzelner Funktionen: Der Verwender hat ja dann doch den Header der Implementierung (Was ich nicht will). Wenn ich was falsch verstehe, mach doch bitte schnell ein Codebeispiel<br />
- (Off Topic): Was passiert wenn ich mehrere grosse Listen auf den Stack werfe. Der Stack hat doch eine vom System vorgeschrieben [Vor dem Start änderbare] Grösse ?</p>
<p>Gruss Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373506</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Tue, 24 Dec 2013 11:15:03 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 11:20:28 GMT]]></title><description><![CDATA[<p>swaechter schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Ist das zu viel verlangt, einfach die Konstruktoren zur korrekten Erzeugung zu nutzen und via Memberfunktionen die Daten wegzukapseln?<br />
Ganz ohne Factory. Und ohne PIMPL, dessen Sinn und Zweck es eigentlich ist, nicht alle bneötigten Header zu inkludieren.<br />
Und RAII hat keine Nachteile, die den &quot;Stack sprengen könnten&quot;.</p>
</blockquote>
<p>- Warum so und nicht anderst ? Was ist sind deine Beweggründe, dies so zu realiseren ?</p>
</blockquote>
<p>Man spart sich Programmierarbeit, wenn man nur Klassen ohne Factory hat.</p>
<blockquote>
<p>- Betreffend Header und exportieren einzelner Funktionen: Der Verwender hat ja dann doch den Header der Implementierung (Was ich nicht will). Wenn ich was falsch verstehe, mach doch bitte schnell ein Codebeispiel</p>
</blockquote>
<p>Es wäre einfacher wenn du sagen würdest, was deine Klassen machen.<br />
Nur mit dem jetzigen Beispiel lässt sich nur schwer Code zeigen.<br />
Und ja, wenn du private Daten von einem Typ hast, die keine Pointer sind, muss der Header inkludiert werden. Aus rein programmiertechnischer Sicht ist das kein Problem, da der Client eh nicht (diverse Tricks jetzt mal außen vor gelassen) darauf zugreifen kann. Höchstens aus Wartungsgründen, da er dann recompilen muss, wenn sich die Implementierung ändert. Und deswegen gibt es PIMPL.</p>
<blockquote>
<p>- (Off Topic): Was passiert wenn ich mehrere grosse Listen auf den Stack werfe. Der Stack hat doch eine vom System vorgeschrieben [Vor dem Start änderbare] Grösse ?</p>
</blockquote>
<p>RAII ist nicht &quot;schmeiß alles auf dem Stack&quot;, RAII ist &quot;lass Destruktoren aufräumen&quot;. Aber solange es keinen Grund gibt, etwas auf dem Heap zu werfen, lass es auf dem Stack. Der ist groß genug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373508</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 24 Dec 2013 11:20:28 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 11:27:57 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Es wäre einfacher wenn du sagen würdest, was deine Klassen machen.</p>
</blockquote>
<p>Was ich im Kopf habe (Als Klassen):<br />
- Platform: Kann Projekte erstellen/editieren/löschen und den Projekten Einträge hinzufügen/editieren/entfernen<br />
- Project: Beinhaltet Name und Einträge als Liste<br />
- Entry: Beinhaltet einen (Key)Namen und Beschreibung</p>
<p>Nun, Gedanken betreffend der Platform:<br />
- Die Platform übernimmt das Inputchecking<br />
- Der Verwender muss die Platform verwenden, um Projekte und Einträge ändern zu können<br />
- Project und Entry sollen als reine Datenobjekte dienen, sprich keine Logik enthalten (Darum auch die Bearbeitung über die Platform)</p>
<p>Wenn Du mir einen anderen Weg aufzeigen kannst, sowas zu realiseren, her damit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373509</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Tue, 24 Dec 2013 11:27:57 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 11:47:29 GMT]]></title><description><![CDATA[<p>Also in etwa so?</p>
<pre><code>struct project {...};
struct entry {...};

class platform
{
public:
  add_or_change_entry(size_t index, entry e);
  add_or_change_project(size_t index, project p);

private:
  container projects_;
  container entrys_;
};
</code></pre>
<p>Was spricht dagegen, dass genau so zu machen?<br />
Edit: Mit entry in project, hatte das überlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373510</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 24 Dec 2013 11:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 12:30:06 GMT]]></title><description><![CDATA[<p>Genau, etwas in der Art. Nun möchte ich aber die Implementierung von der Schnittstelle abtrennen, um zum Beispiel beim Hinzufügen/Änderung von privaten Attributen in der Implementierung nicht gleich das ganze Offset zu verschieben (Bin auf dem Gebiet neu &amp; daran mich einzulesen).</p>
<p>Nun war meine Idee:<br />
- Öffentliche Klasse besitzt einen Pointer zu der libraryinternen Implementierung<br />
- Methodenzugriffe auf die öffentliche Klasse werden an die Implementierung weitergeleitet, diese arbeitet die Sache ab<br />
- Änderungen in der Implementuerung machen eine Neukompilierung der Applikation mit der (neuen) Library überflüssig ?</p>
<p>Oder habe ich da was falsch verstanden ? An dieser Stelle könnte ich doch das PIMPL Pinzip verwenden ?</p>
<p>Gruss Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373517</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Tue, 24 Dec 2013 12:30:06 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 12:34:35 GMT]]></title><description><![CDATA[<p>swaechter schrieb:</p>
<blockquote>
<p>Nun möchte ich aber die Implementierung von der Schnittstelle abtrennen, um zum Beispiel beim Hinzufügen/Änderung von privaten Attributen in der Implementierung nicht gleich das ganze Offset zu verschieben (Bin auf dem Gebiet neu &amp; daran mich einzulesen).</p>
</blockquote>
<p>Wozu? Wo liegt das Problem, wenn sich das Layout der Membervariablen ändert?</p>
<p>Was du beschreibst, ist gerade das PImpl-Idiom. Wie erwähnt wird es primär zur Verringerung von Compilezeit-Abhängigkeiten eingesetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373518</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 24 Dec 2013 12:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 15:46:35 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Wozu? Wo liegt das Problem, wenn sich das Layout der Membervariablen ändert?</p>
</blockquote>
<p>Klar könnte ich darauf verzichten und immer davon ausgehen, dass Applikation und Library neu kompiliert &amp; gelinkt werden, aber eventuell möchte ich das eines Tages ändern und dann alles umbauen, nur um das zu erreichen ? Lieber fange ich dann gleich richtig an und setze auf eine lose Kopplung zwischen Implementierung und Schnittstelle</p>
<p>Betreffend Businessobjekten: Gibt es da auch eine gute Möglichkeit, eine lose Kopplung zu erreichen oder schreibt man einfach eine Klasse, bestehend aus lauter virtuellen Funktionen und das eigentliche (interne) Businessobjekt erbt davon ? PIMPL würde in einem solchen Fall ja einen enormen Overhead generieren (Was mehr auffällt als bei einer Klasse, die aus lauter Logik besteht und Inpputchecking betreibt) ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373553</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Tue, 24 Dec 2013 15:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 15:49:52 GMT]]></title><description><![CDATA[<p>swaechter schrieb:</p>
<blockquote>
<p>Klar könnte ich darauf verzichten und immer davon ausgehen, dass Applikation und Library neu kompiliert &amp; gelinkt werden, aber eventuell möchte ich das eines Tages ändern und dann alles umbauen, nur um das zu erreichen ? Lieber fange ich dann gleich richtig an und setze auf eine lose Kopplung zwischen Implementierung und Schnittstelle</p>
</blockquote>
<p>Nachträglich pimpl einfügen? Das ist quasi umsonst, da muss ja nicht einmal die Schnittstelle geändert werden.</p>
<blockquote>
<p>PIMPL würde in einem solchen Fall ja einen enormen Overhead generieren</p>
</blockquote>
<p>lol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373555</guid><dc:creator><![CDATA[justlol]]></dc:creator><pubDate>Tue, 24 Dec 2013 15:49:52 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 16:12:35 GMT]]></title><description><![CDATA[<p>justlol schrieb:</p>
<blockquote>
<p>swaechter schrieb:</p>
<blockquote>
<p>Klar könnte ich darauf verzichten und immer davon ausgehen, dass Applikation und Library neu kompiliert &amp; gelinkt werden, aber eventuell möchte ich das eines Tages ändern und dann alles umbauen, nur um das zu erreichen ? Lieber fange ich dann gleich richtig an und setze auf eine lose Kopplung zwischen Implementierung und Schnittstelle</p>
</blockquote>
<p>Nachträglich pimpl einfügen? Das ist quasi umsonst, da muss ja nicht einmal die Schnittstelle geändert werden.</p>
<blockquote>
<p>PIMPL würde in einem solchen Fall ja einen enormen Overhead generieren</p>
</blockquote>
<p>lol</p>
</blockquote>
<p>Danke für deinen sehr konstruktiven Beitrag. Wenn Du schon solchen Content schreibst, registrier dich doch bitte, dass man dich erkennen kann (und ich dir konkret aus dem Weg gehen kann)</p>
<p>Betreffend PIMPL nachträglich einfügen:</p>
<p>1.) Was muss nicht mehr eingefügt werden ? Sollte es wie in Frage 2 sein hast Du definitiv kein PIMPL...<br />
2.) Nein sicher nicht. Hast Du eine Klasse, in welcher gewisse Methoden exportiert und andere nicht exportiert werden, verschiebt sich dein Offset immer, wenn Du gewisse Bestandteile änderst (Methoden/Attribute etc). Das ist nicht gerade das, was ich anstrebe (Betreffend loser Kopplung).</p>
<p>Vorherige Frage steht immer noch im Raum</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373560</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Tue, 24 Dec 2013 16:12:35 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 16:50:58 GMT]]></title><description><![CDATA[<p>Binärschnittstellen in C++ sind sowieso eine Angelegenheit für sich. Du bist wegen fehlendem standardisierten ABI relativ eingeschränkt und oft zum Neukompilieren gezwungen (spätestens wenn du den Compiler oder nur schon die Version oder bestimmte Flags wechselst).</p>
<p>Du solltest dir also überlegen, wie weit du deswegen dein Design verkomplizieren willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373565</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 24 Dec 2013 16:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Tue, 24 Dec 2013 17:19:56 GMT]]></title><description><![CDATA[<p>Hallo Nexus</p>
<p>Danke für deinen Antwort. Ich muss ein paar Sachen klarstellen und ergänzen, da ich erst seit gestern in das Thema reingekommen bin und sich der Thread doch recht entwickelt hat. Früher habe ich Libraries einfach exportiert und das wars - mehr nicht (Schnittstelle und Implementierung = Eine Klasse). Seit gestern habe ich mich vertieft damit auseinandergesetzt, um das ganze sauberer gestalten zu können. Zu ergänzen (meinerseits) ist:</p>
<p>Infrastruktur<br />
- Ich verwende für die Applikation und die Library denselben Compiler und dasselbe CRT (Sprich MSVC und dessen CRT oder GCC/Clang und dessen GLIBC)<br />
- Es kann vorkommen, dass die Applikation wegen Änderungen in der Library nicht neukompiliert wird (Wir reden über eine Patch Level Änderung in der Library, nicht Major &amp; Minor, deshalb muss gewährleistet sein, dass sich das Offset nicht ändert (Z.B neue Variable wird eingeführt). ANMERKUNG: Ich habe mich noch nicht vertieft in Offset Changing eingelesen. Wird das ganze über eine lose Kopplung realisiert, funktioniert die Applikation auch mit der geupdateter Library. Verwende ich aber 1 Klasse wie bereits mehrmals in diesem Thread vorgeschlagen wurde, ist es (gut) möglich, dass sich das Offset der Library ändert [und das der Applikation nicht, da kein recompile].Das CRT zwischen Applikation und Library bleibt aber auch in diesem Fall gleich (Build Server)</p>
<p>Betreffend deiner Aussage 1:<br />
- Wird deine Aussage nicht eher unwichtig/rückt in den Hintergrund, wenn ich garantieren kann, dass ich denselben Compiler und dasselbe CRT verwenden kann. Es erfolgt definitv kein Compiler/CRT Mixing ! Entweder kompiliert das Buildsystem ALLES oder nur Änderungen, aber immer mit dem gleichen Compiler/CRT.</p>
<p>Betreffend deiner Aussage 2:</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Du solltest dir also überlegen, wie weit du deswegen dein Design verkomplizieren willst.</p>
</blockquote>
<p>Wie darf man das verstehen. Könntest Du mir ein <strong>komplettes Codebeispiel</strong> geben, wie Du es machen würdest, wenn dir jemand den Auftrag gibt, eine Klasse zu schreiben, welche Projekte und Eintrage machen/editieren/löschen kann, WENN Du davon ausgehen kannst, dass der Compiler und das CRT IMMER dasselbe sind und eine lose Kopplung von Nöten ist ? Ich wär dir dafür sehr dankbar.</p>
<p>Schöne Weihnachten dir &amp; Mitleser<br />
Gruss Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373568</guid><dc:creator><![CDATA[swaechter]]></dc:creator><pubDate>Tue, 24 Dec 2013 17:19:56 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Thu, 26 Dec 2013 23:03:13 GMT]]></title><description><![CDATA[<p>Bezüglich ABI kompatiblen Änderungen in Klassen:</p>
<p>AFAIK ändert sich die ABI Schnittstelle einer Klasse nicht, wenn ein neuer Member(eine neue Memeber-Methode?) immer ans ende der Klassen definition gepackt wird.</p>
<p>Wobei ich nicht weis, ob sich die ABI eventuell ändert, wenn eine Änderung in einer Klasse gemacht wird, welche als Basis für andere Klassen Verwendung findet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373807</guid><dc:creator><![CDATA[firefly]]></dc:creator><pubDate>Thu, 26 Dec 2013 23:03:13 GMT</pubDate></item><item><title><![CDATA[Reply to Grundlegende Fragen über das Design einer Shared Library in C++ mit Java im Hinterkopf on Fri, 27 Dec 2013 06:07:36 GMT]]></title><description><![CDATA[<p>firefly schrieb:</p>
<blockquote>
<p>Bezüglich ABI kompatiblen Änderungen in Klassen:</p>
<p>AFAIK ändert sich die ABI Schnittstelle einer Klasse nicht, wenn ein neuer Member(eine neue Memeber-Methode?) immer ans ende der Klassen definition gepackt wird.</p>
</blockquote>
<p>Bei nicht-statischen Datenmembern wird die Klasse dadurch bei allen Systemen die ich kenne inkompatibel, da sich <code>sizeof(T)</code> ändert.</p>
<p>Neue Methoden sind dagegen meist egal. So lange sie nicht virtuell sind, ist dabei auch egal wo man sie dazuschreibt. Und wenn sie virtuell sind, man sie aber brav hinter alle anderen virtuellen Funktionen schreibt, dann ist es auch egal. Zumindest eben auf den Systemen nicht ich kenne.</p>
<p>Hat aber mit Standard C++ nix zu tun, da der Standard diesbezüglich nix vorschreibt.</p>
<blockquote>
<p>Wobei ich nicht weis, ob sich die ABI eventuell ändert, wenn eine Änderung in einer Klasse gemacht wird, welche als Basis für andere Klassen Verwendung findet</p>
</blockquote>
<p>Wenn nicht-statische Datenmenber betroffen sind, ist die Chance gross, dass alle abgeleiteten Klassen neu übersetzt werden müssen. Wenn sich die Grösse oder das Layout der Klasse bzw. abgeleiteten Klassen dadurch ändert auch der gesamte Client Code.</p>
<p>Sowas sind aber Dinge über die ich mir üblicherweise nicht den Kopf zerbreche.<br />
Für mich gibt es ein paar sinnvolle Varianten damit umzugehen:<br />
* Reines C Interface<br />
* COM<br />
* PIMPL<br />
* volles C++ Interface + immer alles neu Übersetzen</p>
<p>Zwischenlösungen mache ich da nur wenn ich wirklich muss. Was in den letzten Jahren nicht vorgekommen ist. Ich hab' aber auch nur mehr ein Projekt wo ich ein stabiles binary Inteface garantieren muss, und das verwendet COM.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373825</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 27 Dec 2013 06:07:36 GMT</pubDate></item></channel></rss>