<?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[Automatische Konvertierung -&amp;gt; Ist sowas möglich?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Die Problemstellung zuerst:<br />
Es gibt zwei Klassen, nennen wir sie A und B. Die beiden Klassen sind fertig und können nicht modifiziert werden. Sie stammen von unterschiedlichen Bibliotheken und es muss eine Kommunikation zwischen diesen Bibliotheken realisiert werden. Dabei muss ein Objekt von der Klasse A umgewandelt werden zu einem Objekt der Klasse B und umgekehrt.</p>
<p>Mein bisherige Lösung:<br />
Die ist eigentlich ganz einfach. Ich habe eine Funktion geschrieben, welche ein A entgegennimmt und ein B zurückgibt, sowie eine zweite Funktion, welche ein B entgegennimmt und ein A zurückgibt. Simpel und einfach, nur leider nicht gerade sehr praktisch. Dadurch entstehen dann solche Quellcodezeilen:</p>
<pre><code class="language-cpp">LibraryB::set_something(to_b_object(LibraryA::get_something()));
// bzw.
LibraryA::set_something(to_a_object(LibraryB::get_something()));
</code></pre>
<p>Die Frage:<br />
Kann ich diese Funktion <code>to_b_object</code> , bzw. <code>to_a_object</code> , irgendwie automatisieren, bzw. verstecken? Also das die Konvertierung von alleine gemacht wird? Grundsätzlich suche ich sowas:</p>
<pre><code class="language-cpp">class A
{
};

class B
{
};

////////////////////
// DAS HIER: -------

operator A(B const&amp;)
{
	return A();
}

// -----------------
////////////////////

void foo(A const&amp;)
{
}

int main()
{
	B b;
	foo(b);

	return 0;
}
</code></pre>
<p>Das geht natürlich nicht, weil es ein &quot;non-static member&quot; sein muss. Aber gibt es irgendeinen Weg?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240071/automatische-konvertierung-gt-ist-sowas-möglich</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 06:52:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240071.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 May 2009 12:43:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Automatische Konvertierung -&amp;gt; Ist sowas möglich? on Fri, 01 May 2009 12:43:26 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Die Problemstellung zuerst:<br />
Es gibt zwei Klassen, nennen wir sie A und B. Die beiden Klassen sind fertig und können nicht modifiziert werden. Sie stammen von unterschiedlichen Bibliotheken und es muss eine Kommunikation zwischen diesen Bibliotheken realisiert werden. Dabei muss ein Objekt von der Klasse A umgewandelt werden zu einem Objekt der Klasse B und umgekehrt.</p>
<p>Mein bisherige Lösung:<br />
Die ist eigentlich ganz einfach. Ich habe eine Funktion geschrieben, welche ein A entgegennimmt und ein B zurückgibt, sowie eine zweite Funktion, welche ein B entgegennimmt und ein A zurückgibt. Simpel und einfach, nur leider nicht gerade sehr praktisch. Dadurch entstehen dann solche Quellcodezeilen:</p>
<pre><code class="language-cpp">LibraryB::set_something(to_b_object(LibraryA::get_something()));
// bzw.
LibraryA::set_something(to_a_object(LibraryB::get_something()));
</code></pre>
<p>Die Frage:<br />
Kann ich diese Funktion <code>to_b_object</code> , bzw. <code>to_a_object</code> , irgendwie automatisieren, bzw. verstecken? Also das die Konvertierung von alleine gemacht wird? Grundsätzlich suche ich sowas:</p>
<pre><code class="language-cpp">class A
{
};

class B
{
};

////////////////////
// DAS HIER: -------

operator A(B const&amp;)
{
	return A();
}

// -----------------
////////////////////

void foo(A const&amp;)
{
}

int main()
{
	B b;
	foo(b);

	return 0;
}
</code></pre>
<p>Das geht natürlich nicht, weil es ein &quot;non-static member&quot; sein muss. Aber gibt es irgendeinen Weg?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704067</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 01 May 2009 12:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Konvertierung -&amp;gt; Ist sowas möglich? on Fri, 01 May 2009 12:54:45 GMT]]></title><description><![CDATA[<p>Wie wäre es, wenn du das Ganze über zwei Wrapperklasse lösen würdest, die jeweils einen impliziten Konstruktor der einen Klasse und einen Konvertierungsoperator zur anderen hätten?</p>
<p>Edit: Hmm, scheint nicht zu funktionieren, sorry. Könntest du an den Stellen, an denen du die Klassen gemeinsam verwendest, nicht eine einheitliche Klasse einsetzen, die zu beiden kompatibel ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704072</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 01 May 2009 12:54:45 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Konvertierung -&amp;gt; Ist sowas möglich? on Fri, 01 May 2009 13:21:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Edit: Hmm, scheint nicht zu funktionieren, sorry. Könntest du an den Stellen, an denen du die Klassen gemeinsam verwendest, nicht eine einheitliche Klasse einsetzen, die zu beiden kompatibel ist?</p>
</blockquote>
<p>Genau das kann ich nicht, bzw. probiere ich zu vermeiden. Theoretisch wäre es möglich, würde aber eine Heidenarbeit sein, da die eine Bibliothek bei den Schnittstellen umgeschrieben werden müsste und es würde eine zusätzliche Abhängigkeit schaffen, welche ich eigentlich vermeiden möchte.</p>
<p>Die andere Bibliothek möchte ich nicht anfassen, weil sie nicht von mir ist und ziemlich gross. Ich weiss nicht, was dies für Effekte haben könnte. Es wäre allerdings am einfachsten, wenn ich dort die Klasse leicht anpassen würde.</p>
<p>Ich würde aber lieber beide Bibliotheken in Ruhe lassen <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704089</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 01 May 2009 13:21:33 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Konvertierung -&amp;gt; Ist sowas möglich? on Fri, 01 May 2009 13:22:27 GMT]]></title><description><![CDATA[<p>Ich würd so oder so die Klassen der Libs nicht direkt benutzen, geschweige denn die beiden Bibliothelen fest miteinander zu verdrahten. Die Klassen deines Systems sollten die Bibliotheksklassen intern benutzen und die Funktionalität kapseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704090</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 01 May 2009 13:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Konvertierung -&amp;gt; Ist sowas möglich? on Fri, 01 May 2009 13:42:39 GMT]]></title><description><![CDATA[<p>Hmmm, vielleicht sollte ich noch ein wenig konkreter werden, vor allem nach dem was pumuckl gesagt hat. Denn wenn ich es so lösen würde, das wäre ja fatal mühsam.</p>
<p>Die eigene Bibliothek ist eine Datenverwaltung, welche zum Beispiel das Datum über Boost.DateTime speichert.<br />
Nun erstelle ich ein GUI über/mit wxWidgets, jetzt muss natürlich jeweils zwischen Boost.DateTime und wxDateTime konvertiert werden, wenn es zur GUI geht und dann wieder zurück in die Datenverwaltung (also die Veränderungen übernommen werden).</p>
<p>Das ist fast ein reines durchreichen, aber ist eben recht mühsam. Ich könnte natürlich in meiner Datenverwaltung eine Abhängigkeit zu wxWidgets machen und intern dann Boost.DateTime kapseln, aber ich möchte in der Datenverwaltung unabhängig von wxWidgets bleiben.<br />
wxWidgets selber möchte ich nicht anfassen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704095</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 01 May 2009 13:42:39 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Konvertierung -&amp;gt; Ist sowas möglich? on Fri, 01 May 2009 14:07:33 GMT]]></title><description><![CDATA[<p>du hast eine fest verdrahtete Abhängigkeit von wxWidgets <em>und</em> boost::datetime. dadurch dass du keine eigenen datentypen verwendest kannst du das Interface deiner verschiedenen Schichten nicht kontrollieren. Ich denke du solltest wirklich mindestens eines von beiden Systemen kapseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704104</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 01 May 2009 14:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Konvertierung -&amp;gt; Ist sowas möglich? on Fri, 01 May 2009 14:37:00 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>du hast eine fest verdrahtete Abhängigkeit von wxWidgets <em>und</em> boost::datetime. dadurch dass du keine eigenen datentypen verwendest kannst du das Interface deiner verschiedenen Schichten nicht kontrollieren. Ich denke du solltest wirklich mindestens eines von beiden Systemen kapseln.</p>
</blockquote>
<p>Das bringt aber auch nichts, wie soll ich denn diese Verdrahtung mit einer zusätzlichen Klasse aufheben? Die Datenverwaltung weiss nichts von wxWidgets und wxWidgets weiss nichts von der Datenverwaltung. Und diese Unabhängigkeit möchte ich dringends so belassen.</p>
<p>Wenn ich nun in der Datenverwaltung Boost.DateTime kapsle, was bringt mir das? Ich kenne wxWidgets ja nicht, kann dadurch keine implizite Konvertierung erstellen.<br />
Wenn ich Boost.DateTime im eigenen Programm kapsle, wo ich die Datenverwaltung und wxWidgets verwende, bringt mir das eigentlich nur ein Mehraufwand. Das ist dann nicht viel anders als eine Funktion, welche zwischen den Datentypen umwandelt, also wie ich es jetzt schon habe.<br />
Und in wxWidgets etwas verändern gehen, ist auch nicht möglich.</p>
<p>Ich sehe also nicht, wie mir dies etwas bringen sollte, bzw. auf was du hinaus willst.</p>
<p>Vielleicht auch noch zur Klarheit ein Diagramm, wie das Projekt aufgebaut ist:</p>
<pre><code>-------------------
                 |------------- | Boost (Library) |
                 V              -------------------
-----------------------------                        -----------------------
| Datenverwaltung (Library) |           ¦            | wxWidgets (Library) |
-----------------------------                        -----------------------
           |                            ¦                         |
           |                            V                         |
           |                 ----------------                     |
           ---------------&gt;  | Programm.exe | &lt;--------------------
                             ----------------
</code></pre>
<p>(Die Verbindung zwischen Boost und Programm.exe ist für das Problem nebensächlich. Daher die grösseren Lücken im Pfeil.)</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704117</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 01 May 2009 14:37:00 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Konvertierung -&amp;gt; Ist sowas möglich? on Sat, 02 May 2009 11:55:45 GMT]]></title><description><![CDATA[<p>Was du da willst ist afaik so nicht möglich.<br />
Ohne von einer der Klassen abzuleiten wirst du da nicht weiter kommen.</p>
<p>Wenn du eine überschaubare Anzahl(1-3) von Datenbankklassen hast würde ich von denen ableiten, in den Subklassen aber nur Funktionen überladen die du wirklich brauchst(bei der ersten Verwendung).<br />
Tipp:<br />
Wenn du mit Visual Studio arbeitest kannst du dir ein kleines Makro schreiben welches dir den Großteil der Arbeit abnimmt.</p>
<p>Eine andere Möglichkeit sehe ich da nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704395</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Sat, 02 May 2009 11:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Konvertierung -&amp;gt; Ist sowas möglich? on Sat, 02 May 2009 12:45:11 GMT]]></title><description><![CDATA[<p>Ich arbeit nun gerade an eine Möglichkeit. Gestern Abend/Nacht als ich ins Bett ging, kamen mir noch ein zwei Ideen.<br />
Zum einen könnte ich die wxWidgets Klassen kapseln, das wären zwar nicht all zu viele, denn meistens brauche ich Labels, Textboxen und ListCtrls, aber wohl doch immernoch ein ziemlicher Aufwand. Deshalb kam mir die Idee, dass ich eigentlich nur die Schnittstellen/Funktionen/Methoden kapseln könnte. Um dem ganzen noch ein einheitliches Bild zu geben (da wxWidgets extrem uneinheitlich ist), füge ich noch ein wenig Templatemetaprogrammierung hinzu.</p>
<pre><code class="language-cpp">template&lt;typename FromT, typename ToT&gt;
struct Convert;

template&lt;typename T&gt;
struct Convert&lt;T, T&gt;
{
  static T convert(T const&amp; t)
  {
    return t;
  }
};

template&lt;&gt;
struct Convert&lt;std::string, wxString&gt;
{
  static wxString convert(std::string const&amp; str)
  {
    return wxString::FromUTF8(str.c_str());
  }
};

// usw.

template&lt;typename ControlT&gt;
struct GetSetControlValue
{
  typedef wxString SetType;
  typedef wxString GetType;

  static void set(ControlT&amp; control, SetType const&amp; val)
  {
    control.SetValue(val);
  }

  static GetType get(ControlT&amp; control)
  {
    return control.GetValue();
  }
};

// ... Spezialisierungen ...

template&lt;typename ControlT, typename ValueT&gt;
void set_value(ControlT&amp; control, ValueT const&amp; value)
{
  typedef GetSetControlValue&lt;ControlT&gt; GSCV;

  GSCV::set(control, Convert&lt;ValueT, GSCV::SetType&gt;::convert(value));
}
</code></pre>
<p>So ganz fertig durchdacht ist es noch nicht. Ich überlege mir sogar aktuell, ob ich nicht eine Klasse dazu schreiben soll, welche diesen Datenaustausch noch weiter automatisiert. Wodurch ich am Ende in einer Dialogklasse ein entsprechendes Datenaustausch Objekt initialisiere und dann nur noch jeweils ein Objekt übergeben kann. Dann wird alles korrekt geschrieben und dann wieder korrekt gelesen. Mal schauen, wie ich die Idee weiterentwicklen werde <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704425</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 02 May 2009 12:45:11 GMT</pubDate></item></channel></rss>