<?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[Interfaces]]></title><description><![CDATA[<p>Hallo,<br />
ich habe bis her vor allem mit Java gearbeitet, weshalb ich noch nicht so sicher in C++ bin. Deshalb komme ich auch mit einem Java Ansatz und der Frage, wie man es in C++ macht.</p>
<p>Ich schreibe ein Programm, was vor allem einen Algorithmus zur Verfügung stellt und von verschiedenen Programmen eingebunden werden kann.<br />
Um den aktuellen Stand sehen der Berechnung sehen zu können, gibt es eine Statusausgabe. Mit der Ausgabe an sich hat der Algorithmus aber nichts zu tun. Wie die Oberfläche des Programms aussieht soll dem Algorithmus ja egal sein. Oder ob es ein Programm nur in eine Datei leitet um zu debuggen.</p>
<p>Um es so individuell wie möglich zu machen, wollte ich mir ein Objekt übergeben lassen, das mir eine Methode wie &quot;writeInfo&quot; oder so anbietet. Was die dann macht ist meinem Algorithmus egal.</p>
<p>In Java würde ich mir ein Interface InfoOutput oder so machen, in dem die Methode &quot;writeInfo&quot; festgelegt wird. Somit kann später jede Klasse übergeben werfen, die das Interface implementiert und somit sicher stellt, dass die Methode da ist.</p>
<p>Wenn ich nach Interface Google kommen vor allem Klassen mit virtuellen Methoden.<br />
Ist dies das Äquivalenz zu Interfaces in Java?<br />
Bei den Methoden steht ein = 0 dahinter. Was bedeutet das?</p>
<p>Vielen Dank für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284238/interfaces</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 04:32:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284238.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Mar 2011 14:07:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Interfaces on Mon, 28 Mar 2011 14:07:31 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe bis her vor allem mit Java gearbeitet, weshalb ich noch nicht so sicher in C++ bin. Deshalb komme ich auch mit einem Java Ansatz und der Frage, wie man es in C++ macht.</p>
<p>Ich schreibe ein Programm, was vor allem einen Algorithmus zur Verfügung stellt und von verschiedenen Programmen eingebunden werden kann.<br />
Um den aktuellen Stand sehen der Berechnung sehen zu können, gibt es eine Statusausgabe. Mit der Ausgabe an sich hat der Algorithmus aber nichts zu tun. Wie die Oberfläche des Programms aussieht soll dem Algorithmus ja egal sein. Oder ob es ein Programm nur in eine Datei leitet um zu debuggen.</p>
<p>Um es so individuell wie möglich zu machen, wollte ich mir ein Objekt übergeben lassen, das mir eine Methode wie &quot;writeInfo&quot; oder so anbietet. Was die dann macht ist meinem Algorithmus egal.</p>
<p>In Java würde ich mir ein Interface InfoOutput oder so machen, in dem die Methode &quot;writeInfo&quot; festgelegt wird. Somit kann später jede Klasse übergeben werfen, die das Interface implementiert und somit sicher stellt, dass die Methode da ist.</p>
<p>Wenn ich nach Interface Google kommen vor allem Klassen mit virtuellen Methoden.<br />
Ist dies das Äquivalenz zu Interfaces in Java?<br />
Bei den Methoden steht ein = 0 dahinter. Was bedeutet das?</p>
<p>Vielen Dank für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041312</guid><dc:creator><![CDATA[Xaver]]></dc:creator><pubDate>Mon, 28 Mar 2011 14:07:31 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces on Mon, 28 Mar 2011 14:20:01 GMT]]></title><description><![CDATA[<p>Also das mit dem =0 bedeutet das die klasse rein virtuel ist und keien Instanz der Klasse erschaffen werdne kann. Das entspricht so ungefaehr einem Interface in Java. Da es halt nur festlegt wie die schnittstelle auszusehen hat.<br />
Wenn Du von dieser abstrakten Basisklasse ableitest dann hast du eine Vorgabe wie die Klassen spaeter auszusehen haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041321</guid><dc:creator><![CDATA[muli]]></dc:creator><pubDate>Mon, 28 Mar 2011 14:20:01 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces on Mon, 28 Mar 2011 14:19:24 GMT]]></title><description><![CDATA[<p>Ein gebräuchlicher Ansatz in C++ wäre:</p>
<pre><code class="language-cpp">struct status { ... };

template&lt;class Callback&gt;
void algothmus(Callback callback)
{
    ...
    callback(status(...)); // regelmäßig aufrufen
    ...
}

void print_status(status s)
{
    ...
}

int main()
{
    algorithmus(print_status);
}
</code></pre>
<p>Statt einer Funktion kannst du mit ein paar Zusatzfunktionen auch Methoden eines Objektes oder anderes übergeben. Diese Variante hat gegenüber Polymorphie den Vorteil, dass sie performanter ist, zum einen sparst du den Overhead von virtuellen Funktionen, zum anderen kann der Compiler eventuell inlinen.</p>
<p>Der Nachteil ist, dass es in deinem Fall eventuell nicht funktioniert. Was meinst du mit &quot;Programm&quot;? Hast du wirklich eine laufende Anwendung, auf die andere Anwendungen durch irgendeine Art IPC zugreifen? Dann geht das mit den Templates nicht. Ebenfalls kannst du Probleme bekommen, wenn dein Programm eine dazugelinkte Bibliothek ist. Es geht, wenn dein Programm eine Bibliothek im Quelltext ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041325</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 28 Mar 2011 14:19:24 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces on Mon, 28 Mar 2011 14:33:04 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Ein gebräuchlicher Ansatz in C++ wäre:</p>
<pre><code class="language-cpp">struct status { ... };

template&lt;class Callback&gt;
void algothmus(Callback callback)
{
    ...
    callback(status(...)); // regelmäßig aufrufen
    ...
}

void print_status(status s)
{
    ...
}

int main()
{
    algorithmus(print_status);
}
</code></pre>
<p>Statt einer Funktion kannst du mit ein paar Zusatzfunktionen auch Methoden eines Objektes oder anderes übergeben. Diese Variante hat gegenüber Polymorphie den Vorteil, dass sie performanter ist, zum einen sparst du den Overhead von virtuellen Funktionen, zum anderen kann der Compiler eventuell inlinen.</p>
<p>Der Nachteil ist, dass es in deinem Fall eventuell nicht funktioniert. Was meinst du mit &quot;Programm&quot;? Hast du wirklich eine laufende Anwendung, auf die andere Anwendungen durch irgendeine Art IPC zugreifen? Dann geht das mit den Templates nicht. Ebenfalls kannst du Probleme bekommen, wenn dein Programm eine dazugelinkte Bibliothek ist. Es geht, wenn dein Programm eine Bibliothek im Quelltext ist.</p>
</blockquote>
<p>Schwierig zu erklären für was es ist.<br />
Wir haben ein Grundprogramm, für das wir PlugIns schreiben. Diese PlugIns können diesen Algorithmus mit einbauen. Der Algorithmus wird als lib kompiliert, deshalb dazu gelinkt.</p>
<p>Wenn ich es perfomanter mit einer Methode machen kann, würde ich dies machen. Auf welche Kriterien muss ich achten, ob ich dies so machen kann?</p>
<p>Ansonsten habe ich es gerade mit der virtuellen Methode probiert.</p>
<p>Namen sind beispielhaft, also nicht darauf achten:<br />
Interface:</p>
<blockquote>
<p>class IOutput{<br />
public:<br />
virtual void writeOutput(CString message);<br />
};</p>
</blockquote>
<p>in der Headerdatei der Oberfläche</p>
<blockquote>
<p>class Oberflaeche: public IOutput<br />
{<br />
...<br />
public:<br />
...<br />
virtual void writeOutput(CString message);<br />
}</p>
</blockquote>
<p>in der cpp Datei:</p>
<blockquote>
<p>...</p>
<p>void Oberflache::writeOutput(CString message)<br />
{<br />
...<br />
}</p>
</blockquote>
<p>Nun kommt aber aber beim Kompilieren die Fehlermeldung: error LNK2001: Nicht aufgelöstes externes Symbol &quot;&quot;public: virutal void __thiscall IOuput::writeOutput( ........</p>
<p>und dann noch die Fehlermeldung<br />
fatal error LNK1120:1 nicht aufgelöster externe Verweise.</p>
<p>Ich denke ich habe was falsch gemacht. Aber was?</p>
<p>In deinem Beispiel lässt du dir ein struct übergeben. Welchen Vorteil habe ich damit, außer dass ich mehr Infos rein packen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041336</guid><dc:creator><![CDATA[Xaver]]></dc:creator><pubDate>Mon, 28 Mar 2011 14:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces on Mon, 28 Mar 2011 14:34:19 GMT]]></title><description><![CDATA[<p>ahh = 0 habe ich vergessen (sorry für die unnötige Frage deshalb)</p>
<p>ging nun zum kompilieren, ich teste es</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041337</guid><dc:creator><![CDATA[Xaver]]></dc:creator><pubDate>Mon, 28 Mar 2011 14:34:19 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces on Mon, 28 Mar 2011 14:40:01 GMT]]></title><description><![CDATA[<p>Das Problem in meinem Beispiel ist das Template. Wenn die Plugins statisch zur Compilezeit gelinkt werden, kann es gehen, dynamisch geht es aber nicht.<br />
Dein jetztiger Weg ist wahrscheinlich besser. Eine andere Möglichkeit wären noch normale Funktionszeiger, aber da bist du eben relativ eingeschränkt.</p>
<p>Warum struct? Du kannst mehr Daten übergeben. Ich wusste ja nicht, was bei dir konkret übergeben werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041343</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 28 Mar 2011 14:40:01 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces on Mon, 28 Mar 2011 18:41:22 GMT]]></title><description><![CDATA[<p>struct ist exakt das selbe wie class, außer dass alles default public ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041480</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 28 Mar 2011 18:41:22 GMT</pubDate></item></channel></rss>