<?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[grundoperation +,-,*,&#x2F; in basisklasse]]></title><description><![CDATA[<p>hallo,<br />
ich habe bei meinen klassen festgestellt, dass viele mit den besagten operatoren arbeiten und das prinzip bei deren definition/deklaration immer das gleiche ist. als beispiel für einen +/- operator folgendes.</p>
<pre><code class="language-cpp">template&lt;class t&gt;
class cadd{
  public:
    virtual t &amp;add(const t &amp;src) = 0;
    virtual t negate() const = 0;
    t &amp;operator += (const t &amp;src)
    {
      return add(src);
    };
    t &amp;operator -= (const t &amp;src)
    {
      return add(src.negate());
    };
    t &amp;operator *= (int n)
    {
      //quasi n mal sich selbst aufaddieren
    };
    t operator - () const
    {
      return src.negate();
    };
};

t operator + (cadd&lt;t&gt; const &amp;lhs, t const &amp; rhs)
{
  cadd&lt;t&gt; l(lhs); //problem
  return l += rhs;
};

t operator - (cadd&lt;t&gt; const &amp;lhs, t const &amp; rhs)
{
  return lhs + rhs.negate();
};

t operator * (cadd&lt;t&gt; const &amp;lhs, int rhs)
{
  cadd&lt;t&gt; l(lhs); //problem
  return l *= rhs;
};
</code></pre>
<p>analog kann man sowas auch noch für die * und / operatoren machen. mein ziel ist die redundanz im code zu vermeiden, da man ja letztendes doch immer wieder das gleiche aufschreibt. so wie es jetzt dasteht geht es jedenfalls nicht, da bekommt man diverse fehlermeldungen z.B. das bei &quot;//problem&quot; im code eine abstrakte klasse nicht instanziert werden kann, was ja auch klar ist.<br />
wenn jemand eine idee hat oder mir sagen kann warum das nicht gehen kann, wäre ich sehr dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224918/grundoperation-in-basisklasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 23:16:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224918.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Oct 2008 17:12:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to grundoperation +,-,*,&#x2F; in basisklasse on Thu, 16 Oct 2008 17:12:09 GMT]]></title><description><![CDATA[<p>hallo,<br />
ich habe bei meinen klassen festgestellt, dass viele mit den besagten operatoren arbeiten und das prinzip bei deren definition/deklaration immer das gleiche ist. als beispiel für einen +/- operator folgendes.</p>
<pre><code class="language-cpp">template&lt;class t&gt;
class cadd{
  public:
    virtual t &amp;add(const t &amp;src) = 0;
    virtual t negate() const = 0;
    t &amp;operator += (const t &amp;src)
    {
      return add(src);
    };
    t &amp;operator -= (const t &amp;src)
    {
      return add(src.negate());
    };
    t &amp;operator *= (int n)
    {
      //quasi n mal sich selbst aufaddieren
    };
    t operator - () const
    {
      return src.negate();
    };
};

t operator + (cadd&lt;t&gt; const &amp;lhs, t const &amp; rhs)
{
  cadd&lt;t&gt; l(lhs); //problem
  return l += rhs;
};

t operator - (cadd&lt;t&gt; const &amp;lhs, t const &amp; rhs)
{
  return lhs + rhs.negate();
};

t operator * (cadd&lt;t&gt; const &amp;lhs, int rhs)
{
  cadd&lt;t&gt; l(lhs); //problem
  return l *= rhs;
};
</code></pre>
<p>analog kann man sowas auch noch für die * und / operatoren machen. mein ziel ist die redundanz im code zu vermeiden, da man ja letztendes doch immer wieder das gleiche aufschreibt. so wie es jetzt dasteht geht es jedenfalls nicht, da bekommt man diverse fehlermeldungen z.B. das bei &quot;//problem&quot; im code eine abstrakte klasse nicht instanziert werden kann, was ja auch klar ist.<br />
wenn jemand eine idee hat oder mir sagen kann warum das nicht gehen kann, wäre ich sehr dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600046</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Thu, 16 Oct 2008 17:12:09 GMT</pubDate></item><item><title><![CDATA[Reply to grundoperation +,-,*,&#x2F; in basisklasse on Thu, 16 Oct 2008 17:28:02 GMT]]></title><description><![CDATA[<p>Wenn du cadd und die abgeleiteten Typen für die du die operatoren implementieren willst, in einem eigenen Namespace untergebracht hast, geht das relativ einfach mit einem template:</p>
<pre><code class="language-cpp">namespace caddspace {
  template&lt;class t&gt;
  class cadd{ /*...*/};

  //abgeleitete Klassen...

  template &lt;class LHS_t, class t&gt;
  t operator+(LHS_t const&amp; lhs, t const&amp; rhs)
  {  
    LHS_t l(lhs);
    l += rhs;
    return l;
  }
}
</code></pre>
<p>Im globalen Namespace ists natürlich nicht gut, so einen templateoperator zu definieren, da der dann alles versucht, zusammenzuaddieren, wo nur ein &quot;+&quot; zwischen steht. Da der operator aber innerhalb des namespace deklariert ist, wird er nur in Betracht gezogen, wenn der Compiler innerhalb den namespace nach dem Operator sucht. Das wiederum geschieht nur, wenn man den namespace direkt angibt (also explizit <code>caddspace::operator+(a,b)</code> schreibt), oder wenn durch Koenig-Lookup in dem Namespace nach einem geeigneten Operator gesucht wird - Koenig Lookup bedeutet, dass der Compiler in den Namespaces, aus denen die operanden stammen, nach geeigneten Operatoren schaut. In dem Fall wird der op also dann gefunden, wenn einer der operanden im namespace caddspace ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600052</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 16 Oct 2008 17:28:02 GMT</pubDate></item><item><title><![CDATA[Reply to grundoperation +,-,*,&#x2F; in basisklasse on Thu, 16 Oct 2008 17:53:00 GMT]]></title><description><![CDATA[<p>ich hab das jetzt mal so probiert, mit dem namespace, aber leider bekomme ich folgende fehlermeldungen:</p>
<pre><code class="language-cpp">//im header-file
namespace caddspace
{
  //...
  template&lt;class lhs_t, class t&gt;
  t operator + (class lhs_t const &amp;lhs, t const &amp;rhs);
}
//in cpp-file
using namespace caddspace;
template&lt;class lhs_t, class t&gt;
t operator + (class lhs_t const &amp;lhs, t const &amp;rhs)
{
  lhs_t ret(lhs);
  return ret += rhs;
};
</code></pre>
<pre><code>error C2649: 'typename' : is not a 'class'
error C2988: unrecognizable template declaration/definition
error C2059: syntax error : '&lt;end Parse&gt;'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1600071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600071</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Thu, 16 Oct 2008 17:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to grundoperation +,-,*,&#x2F; in basisklasse on Thu, 16 Oct 2008 17:58:58 GMT]]></title><description><![CDATA[<p>Templates werden grundsätzlich in den Headern vollständig definiert, da sie speziell gelinkt werden (für jede Typ-Instanziierung eines Templates wird schlussendlich eine eigene Funktion oder Klasse erstellt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600078</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 16 Oct 2008 17:58:58 GMT</pubDate></item><item><title><![CDATA[Reply to grundoperation +,-,*,&#x2F; in basisklasse on Thu, 16 Oct 2008 18:50:39 GMT]]></title><description><![CDATA[<p>deswegen include ich die cpp.datei ja auch in der header datei, ich wollte das halt nur trennen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600113</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Thu, 16 Oct 2008 18:50:39 GMT</pubDate></item><item><title><![CDATA[Reply to grundoperation +,-,*,&#x2F; in basisklasse on Thu, 16 Oct 2008 19:08:40 GMT]]></title><description><![CDATA[<p>keine using-direktive in die cpp sondern die operatoren die du definierst qualifizieren:</p>
<pre><code class="language-cpp">template&lt;class lhs_t, class t&gt;
t caddspace::operator + (class lhs_t const &amp;lhs, t const &amp;rhs)
{
  lhs_t ret(lhs);
  return ret += rhs;
};
</code></pre>
<p>Unterscheidet sich nicht besonders von Klassenmethoden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600119</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 16 Oct 2008 19:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to grundoperation +,-,*,&#x2F; in basisklasse on Thu, 16 Oct 2008 19:59:36 GMT]]></title><description><![CDATA[<p>betsen dank jetzt funktioniert alles <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600133</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Thu, 16 Oct 2008 19:59:36 GMT</pubDate></item><item><title><![CDATA[Reply to grundoperation +,-,*,&#x2F; in basisklasse on Fri, 17 Oct 2008 05:52:18 GMT]]></title><description><![CDATA[<blockquote>
<p>mein ziel ist die redundanz im code zu vermeiden</p>
</blockquote>
<p>Um das zu tun, kannst du auch mal einen Blick in boost::operator werfen. <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="😉"
    /><br />
Kann durchaus nützlich sein. Vor allem, wenn du keine Lust hast alle möglichen Operatoren zu definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600218</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 17 Oct 2008 05:52:18 GMT</pubDate></item></channel></rss>