<?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[Frage zum Design einer varchar Klasse]]></title><description><![CDATA[<p>Hi,</p>
<p>für meine DB Bibliothek möchte ich eine &quot;varchar&quot; Klasse zur Verfügung stellen. Der Benutzer kann dann in seinem DB Objekt Member vom Typ &quot;varchar&quot; anlegen. Diese (und natürlich die anderen Member) können dann über eine Schnittstelle (Serializer/Atomizer-Pattern) auf der DB modifiziert werden. Diese Schnittstelle kann natürlich auch für andere Dinge benutzt werden, will sagen, sie ist generisch.</p>
<p>Der Aspekt, der mich beschäftigt, ist, wie ich dem varchar seine Größe mitteile. In meinem ersten Ansatz dachte ich, es ist eine gute Lösung daraus eine template Klasse zu machen:</p>
<pre><code class="language-cpp">template &lt; unsigned int C &gt;
class varchar
{
public:
  unsigned int capacity() { return C; }
};
</code></pre>
<p>Durch den template Parameter könnte ich schon bei der Deklaration angeben welche Größe der varchar auf der DB haben wird:</p>
<pre><code class="language-cpp">class Person
{
public:
  varchar&lt;64&gt; name;
  varchar&lt;256&gt; address;
};
</code></pre>
<p>Für die oben erwähnte Serializer Schnittstelle benötige ich natürlich eine nicht template basierte Basisklasse:</p>
<pre><code class="language-cpp">class atomizer
{
public:
  //...
  virtual serialize(const varchar_base &amp;x) = 0;
  virtual deserialize(varchar_base &amp;x) = 0;
};
</code></pre>
<p>Dann müsste ich eine virtuelle Basisklasse varchar_base zur Verfügung stellen und von dieser meine template varchar Klasse ableiten.</p>
<p>Die zweite Lösung ist, eine nicht template Klasse varchar zu schreiben, bei der die Größe als Parameter im Konstruktor übergeben wird:</p>
<pre><code class="language-cpp">class varchar
{
public:
  explicit varchar(unsigned int capacity);

  unsigned int capacity() const;

private:
  unsigned int capacity_;
};
</code></pre>
<p>Hier finde ich die Schreibweise bei der Benutzung &quot;nicht elegant&quot;, habe mir aber eine virtuelle Klasse gespart (Stichwort Laufzeit):</p>
<pre><code class="language-cpp">class Person
{
public:
  Person()
    : name(64)
    , address(256)
  {}
  varchar name;
  varchar address;
};
</code></pre>
<p>Welche Lösung ist hier zu bevorzugen? Interessant finde ich den Vergleich zwischen Benutzung und Implementation (template und virtuell gegen non-template und unelegant).</p>
<p>Bin auf eure Meinungen und Hinweise gespannt!</p>
<p>Gruß,<br />
zussel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298407/frage-zum-design-einer-varchar-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 19:50:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298407.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Jan 2012 13:27:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zum Design einer varchar Klasse on Thu, 19 Jan 2012 13:27:21 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>für meine DB Bibliothek möchte ich eine &quot;varchar&quot; Klasse zur Verfügung stellen. Der Benutzer kann dann in seinem DB Objekt Member vom Typ &quot;varchar&quot; anlegen. Diese (und natürlich die anderen Member) können dann über eine Schnittstelle (Serializer/Atomizer-Pattern) auf der DB modifiziert werden. Diese Schnittstelle kann natürlich auch für andere Dinge benutzt werden, will sagen, sie ist generisch.</p>
<p>Der Aspekt, der mich beschäftigt, ist, wie ich dem varchar seine Größe mitteile. In meinem ersten Ansatz dachte ich, es ist eine gute Lösung daraus eine template Klasse zu machen:</p>
<pre><code class="language-cpp">template &lt; unsigned int C &gt;
class varchar
{
public:
  unsigned int capacity() { return C; }
};
</code></pre>
<p>Durch den template Parameter könnte ich schon bei der Deklaration angeben welche Größe der varchar auf der DB haben wird:</p>
<pre><code class="language-cpp">class Person
{
public:
  varchar&lt;64&gt; name;
  varchar&lt;256&gt; address;
};
</code></pre>
<p>Für die oben erwähnte Serializer Schnittstelle benötige ich natürlich eine nicht template basierte Basisklasse:</p>
<pre><code class="language-cpp">class atomizer
{
public:
  //...
  virtual serialize(const varchar_base &amp;x) = 0;
  virtual deserialize(varchar_base &amp;x) = 0;
};
</code></pre>
<p>Dann müsste ich eine virtuelle Basisklasse varchar_base zur Verfügung stellen und von dieser meine template varchar Klasse ableiten.</p>
<p>Die zweite Lösung ist, eine nicht template Klasse varchar zu schreiben, bei der die Größe als Parameter im Konstruktor übergeben wird:</p>
<pre><code class="language-cpp">class varchar
{
public:
  explicit varchar(unsigned int capacity);

  unsigned int capacity() const;

private:
  unsigned int capacity_;
};
</code></pre>
<p>Hier finde ich die Schreibweise bei der Benutzung &quot;nicht elegant&quot;, habe mir aber eine virtuelle Klasse gespart (Stichwort Laufzeit):</p>
<pre><code class="language-cpp">class Person
{
public:
  Person()
    : name(64)
    , address(256)
  {}
  varchar name;
  varchar address;
};
</code></pre>
<p>Welche Lösung ist hier zu bevorzugen? Interessant finde ich den Vergleich zwischen Benutzung und Implementation (template und virtuell gegen non-template und unelegant).</p>
<p>Bin auf eure Meinungen und Hinweise gespannt!</p>
<p>Gruß,<br />
zussel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170056</guid><dc:creator><![CDATA[zussel]]></dc:creator><pubDate>Thu, 19 Jan 2012 13:27:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Design einer varchar Klasse on Thu, 19 Jan 2012 17:37:47 GMT]]></title><description><![CDATA[<p>Wieso eigentlich eine <em>virtuelle</em> Basisklasse?</p>
<p>Und wenn du von Laufzeit redest:<br />
Eine Basisklasse zu haben sollte mehr oder weniger kostenlos sein.</p>
<p>Da ist das Festlegen der Größe zur Laufzeit performancetechnisch viel kritischer, weil du dann vermutlich dynamisch speicher allozieren musst.</p>
<p>Die Frage ist: Gibt es Anwendungsfälle, in denen die Größe zur Laufzeit erst festgelegt wird / bekannt ist?<br />
Wenn ja, dann brauchst du auf jeden fall die zweite Variante.</p>
<p>Du könntest auch eine Basisklasse erstellen und beide Varianten implementieren und jeweils davon erben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170155</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Thu, 19 Jan 2012 17:37:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Design einer varchar Klasse on Fri, 20 Jan 2012 08:05:53 GMT]]></title><description><![CDATA[<p>Hi Q!</p>
<p>Q schrieb:</p>
<blockquote>
<p>Wieso eigentlich eine <em>virtuelle</em> Basisklasse?</p>
</blockquote>
<p>Hmm, ich dachte zuerst es wäre zwingend notwendig. Auf Deinen Kommentar hin habe ich meine Implementation mal entsprechend geändert. Und es geht (bis jetzt) auch ohne. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Mal sehen wie meine Serializer Klassen darauf reagieren.</p>
<p>Q schrieb:</p>
<blockquote>
<p>Und wenn du von Laufzeit redest:<br />
Eine Basisklasse zu haben sollte mehr oder weniger kostenlos sein.</p>
</blockquote>
<p>Hierbei ging es mir um die vtable.</p>
<p>Q schrieb:</p>
<blockquote>
<p>Da ist das Festlegen der Größe zur Laufzeit performancetechnisch viel kritischer, weil du dann vermutlich dynamisch speicher allozieren musst.</p>
</blockquote>
<p>Mein erster Ansatz sieht erstmal einen std::string als Member. Da brauch ich erstmal nichts zu allozieren, sondern nur die Größe prüfen.</p>
<p>Q schrieb:</p>
<blockquote>
<p>Die Frage ist: Gibt es Anwendungsfälle, in denen die Größe zur Laufzeit erst festgelegt wird / bekannt ist?<br />
Wenn ja, dann brauchst du auf jeden fall die zweite Variante.</p>
</blockquote>
<p>Ja, wird es definitiv geben.</p>
<p>Q schrieb:</p>
<blockquote>
<p>Du könntest auch eine Basisklasse erstellen und beide Varianten implementieren und jeweils davon erben.</p>
</blockquote>
<p>Diese Variante war mein Ziel und werde ich jetzt so umsetzen.</p>
<p>Danke für Deine Antwort. Hat mich weitergebracht.</p>
<p>Gruß,<br />
zussel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170346</guid><dc:creator><![CDATA[zussel]]></dc:creator><pubDate>Fri, 20 Jan 2012 08:05:53 GMT</pubDate></item></channel></rss>