<?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[const member und operator=]]></title><description><![CDATA[<p>Hi,</p>
<p>ich wollte eine const Membervariable deklarieren, wie z.B. in diesem Minibeispiel:</p>
<pre><code class="language-cpp">class AClass
{
private:
    const int m_constMember;
public:
    AClass(const int val)
        : m_constMember(val)
    {};
};

// ...

AClass a = someMethodThatReturnAnAClassObject();
</code></pre>
<p>Leider mault dann der Compiler, dass ein operator= nicht verfügbar ist (weil er ja wahrscheinlich die const-Variable nicht zuweisen kann). Aber ich kann dies auch selber nicht, wenn ich einen Zuweisungsoperator implementiere, irgendwie so:</p>
<pre><code class="language-cpp">class AClass
{
// ...
    inline AClass&amp; operator=(const AClass&amp; other)
    {
        m_constMember = other.m_constMember;
        return *this;
    ;
};
</code></pre>
<p>Wie macht man das bloß. Sowas muss doch gehen?!?!</p>
<p>Viele Grüße,<br />
Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/148992/const-member-und-operator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 02:32:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/148992.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Jun 2006 09:35:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 09:36:26 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich wollte eine const Membervariable deklarieren, wie z.B. in diesem Minibeispiel:</p>
<pre><code class="language-cpp">class AClass
{
private:
    const int m_constMember;
public:
    AClass(const int val)
        : m_constMember(val)
    {};
};

// ...

AClass a = someMethodThatReturnAnAClassObject();
</code></pre>
<p>Leider mault dann der Compiler, dass ein operator= nicht verfügbar ist (weil er ja wahrscheinlich die const-Variable nicht zuweisen kann). Aber ich kann dies auch selber nicht, wenn ich einen Zuweisungsoperator implementiere, irgendwie so:</p>
<pre><code class="language-cpp">class AClass
{
// ...
    inline AClass&amp; operator=(const AClass&amp; other)
    {
        m_constMember = other.m_constMember;
        return *this;
    ;
};
</code></pre>
<p>Wie macht man das bloß. Sowas muss doch gehen?!?!</p>
<p>Viele Grüße,<br />
Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069392</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Thu, 01 Jun 2006 09:36:26 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 09:39:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>der Zuweisungsop geht ja von einem existierenden Objekt aus. Das const Member hat zu diesem Zeitpunkt z.B. den Wert 5, für IMMER, ist ja konstant.<br />
D.h. hier ist eine erneute Zuweisung über den op= nicht sinnvoll bzw. zulässig.</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069398</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 01 Jun 2006 09:39:15 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 09:41:02 GMT]]></title><description><![CDATA[<p>&quot;const&quot; heißt, daß das Element nicht geändert werden kann. Da kannst du dich noch so sehr auf den Kopf stellen, der Compiler lässt dich diesen Wert nicht mehr ändern.</p>
<p>(aber eigentlich sollte der obere Ausschnitt so funktionieren - der braucht nicht den op=, sondern den Copy-Ctor (und der funktioniert mit const-Membern)).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069403</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 01 Jun 2006 09:41:02 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 09:45:07 GMT]]></title><description><![CDATA[<p>Jaja, aber wie kann ich denn eine Membervariable einführen, die sich nach Erzeugung NIE mehr ändert? Die z.B. von der Konstellation der im Konstruktor übergebenen Parameter abhängt?</p>
<p>Mal als doofes Beispiel das Geschlecht einer Klasse Person. Wenn man Geschlechtsumwandlungen zunächst einmal nicht zulässt, gibt's entweder Jungens oder Mädchen. Und wenn Mutter und Vater auf die Idee kommen, ein neues Objekt zu (er)zeugen, hätte das im Konstruktor z.B. nen Parameter Geschlecht. Die Membervariable könnte und sollte folglich const sein. Aber dann kann ich das Kind nichtmehr irgendwie zuweisen.</p>
<p>Zugegeben, das hinkt etwas bei Personen und Kindern, aber ist klar, was ich meine??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069408</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Thu, 01 Jun 2006 09:45:07 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 09:46:38 GMT]]></title><description><![CDATA[<p>Sorry, der Beitrag bezog sich auf GPC. Da war ich wohl beim schreiben zu langsam</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069409</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Thu, 01 Jun 2006 09:46:38 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 09:53:01 GMT]]></title><description><![CDATA[<p>Hmm, bei mir klappt das nicht. Allerdings auch mit nem struct. liegt's daran? Ich muss wohl mal ein größeres Beispiel geben:</p>
<pre><code class="language-cpp">typedef struct _CurvatureInfo
{
    const float       MinPrincipalCurvature;

    _CurvatureInfo(const float   minPrincipalCurvature = 0.0f)
        : MinPrincipalCurvature(minPrincipalCurvature)
    {
    };
}CurvatureInfo;

// ...

class CUtils
{
public:
    inline static CurvatureInfo CreateCurvature(/* some parameters */)
    {
        // some calculations
        return CurvatureInfo(calculatedValue);
    };
};

// ....
// SomeClass.cpp

void SomeClass::method()
{
    //...
    CurvatureInfo* curvatures = new CurvatureInfo[num];

    for(int i = 0; i &lt; num; i++)
    {
        curvatures[i] = CUtils::CreateCurvature(/* the parameters */);
    }
}
</code></pre>
<p>Puh. Und in der for-Schleife mault der Compiler. Ich hoffe, der Code ist schlüssig. Habe ihn ziemlich zusammengestutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069414</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Thu, 01 Jun 2006 09:53:01 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 09:56:49 GMT]]></title><description><![CDATA[<p>Also entweder du setzt dein Attribut als Pseudo-Konstante (d.h. du sorgst dafür, daß niemand bewußt den Wert ändert) oder du lebst damit, die Objekte nicht zuweisen zu können (es macht ja auch wenig Sinn, einen existierenden Menschen zu überschrieben - und genau das wäre die Semantik hinter dem op=) und reichst nur Zeiger auf deine Objekte herum.</p>
<p>Edit: Und bei deinem Code-Beispiel wäre es eine gute Idee, STL-Container zu verwenden (und per push_back() mit Werten zu füllen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069417</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 01 Jun 2006 09:56:49 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 09:55:41 GMT]]></title><description><![CDATA[<p>FelixManke schrieb:</p>
<blockquote>
<p>Jaja, aber wie kann ich denn eine Membervariable einführen, die sich nach Erzeugung NIE mehr ändert? Die z.B. von der Konstellation der im Konstruktor übergebenen Parameter abhängt?</p>
</blockquote>
<p>Mit const ändert sich nie was.</p>
<p>Um auf dein Beispiel zu verweisen:</p>
<pre><code class="language-cpp">class Person {
public:
  enum Geschlecht {M, W};

private:
  const Geschlecht g;

  //Keine Zuweisungen möglich
  Person&amp; operator=(const Person&amp;);

public:
  Person(Geschlecht g_) : g(g_) {}  // Ctor
  Person(const Person &amp;p) : g(p.g) {}  //Copy Ctor
  ~Person();  //Dtor

  Geschlecht getGeschlecht() const { return g; }
};

//...

Person me(Person::M);  //Männlich
Person you(me);  //ebenfalls männlich, über Copy Ctor

Person x(Person::W);
you = x;  //nix da, op= gesperrt, Geschlechtsumwandlungen sind böse.
</code></pre>
<p>Klaro? <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>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069419</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 01 Jun 2006 09:55:41 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 10:08:01 GMT]]></title><description><![CDATA[<p>Du kannst durchaus auch const member haben. Du musst sie nur zum richtigen Zeitpunkt (Konstruktor) initialisieren:</p>
<p>CPerson.h:</p>
<pre><code>#include &lt;string&gt;

class CPerson
{
private:
    const int m_geschlecht;
    std::string m_name;
public:
    CPerson(int Geschlecht, std::string Name);
    int getGeschlecht();
    std::string &amp;getName();

};
</code></pre>
<p>CPerson.cpp:</p>
<pre><code>#include &quot;CPerson.h&quot;

CPerson::CPerson(int Geschlecht, std::string Name):
m_geschlecht(Geschlecht),
m_name(Name)
{
 // All in initalizers   
}

int CPerson::getGeschlecht()
{
    return m_geschlecht;
}

std::string &amp;CPerson::getName()
{
    return m_name;
}
</code></pre>
<p>Main.cpp:</p>
<pre><code>#include &quot;CPerson.h&quot;
#include &lt;iostream&gt;

int main(int argc, char **argv)
{
    int dummy = 0;
    CPerson Sohn(1, &quot;Peter&quot;);
    CPerson Tocher(0, &quot;Marianne&quot;);

    std::cout &lt;&lt; &quot;Sohn Name: &quot; &lt;&lt; Sohn.getName() 
        &lt;&lt; &quot; Geschlecht: &quot; &lt;&lt; Sohn.getGeschlecht() &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;Tocher Name: &quot; &lt;&lt; Tocher.getName() 
        &lt;&lt; &quot; Geschlecht: &quot; &lt;&lt; Tocher.getGeschlecht() &lt;&lt; std::endl;
    std::cin &gt;&gt; dummy;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1069429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069429</guid><dc:creator><![CDATA[Sid2K6]]></dc:creator><pubDate>Thu, 01 Jun 2006 10:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 10:12:27 GMT]]></title><description><![CDATA[<p>Hmm, aber wie mache ich das in meinem konkreten Fall? Ich kann da ja schlecht einen Copy-Konstruktor benutzen, wenn ich das Ergebnis einfach von einer Methode entgegennehme. Und nen anderen Konstruktor kann ich auch nicht aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069433</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Thu, 01 Jun 2006 10:12:27 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 10:16:47 GMT]]></title><description><![CDATA[<p>Noch mal zur genaueren Erklärung:</p>
<pre><code class="language-cpp">curvatures[i] = CUtils::CreateCurvature(/* the parameters */);
</code></pre>
<p>Hier wird intern der Zuweisungsoperator (=) deiner Klasse aufgerufen.<br />
Da diese aber ein konstantes Member enthält, kannst du diesen Operator ja nicht verwenden (und der Compiler erzeugt auch keine Default-Implementation hierfür).</p>
<p>Wenn du wirklich diese konstante Member behalten willst, mußt du mit Zeigern arbeiten, d.h. z.B.</p>
<pre><code class="language-cpp">inline static CurvatureInfo* CreateCurvature(/* some parameters */)
    {
        // some calculations
        return new CurvatureInfo(calculatedValue); // &lt;-- hier new verwenden
    };

CurvatureInfo** curvatures = new CurvatureInfo*[num];

for(int i = 0; i &lt; num; i++)
{
    curvatures[i] = CUtils::CreateCurvature(/* the parameters */);
}
</code></pre>
<p>Und beim Zerstören des Arrays, dann</p>
<pre><code class="language-cpp">for(int i = 0; i &lt; num; i++)
{
    delete curvatures[i];
}
delete [] curvatures;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1069437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069437</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 01 Jun 2006 10:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 10:22:21 GMT]]></title><description><![CDATA[<p>Ok, Danke. Aber wenn Pointer und Heap die einzige Möglichkeit sind, lasse ich das const vielleicht einfach weg -- macht die Sache einfacher :-).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069441</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Thu, 01 Jun 2006 10:22:21 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 10:47:14 GMT]]></title><description><![CDATA[<p>FelixManke schrieb:</p>
<blockquote>
<p>Hmm, aber wie mache ich das in meinem konkreten Fall? Ich kann da ja schlecht einen Copy-Konstruktor benutzen, wenn ich das Ergebnis einfach von einer Methode entgegennehme. Und nen anderen Konstruktor kann ich auch nicht aufrufen.</p>
</blockquote>
<p>Natürlich kannst du:</p>
<pre><code class="language-cpp">class Person {
  //wie oben
};

Person foo() {
  Person p(Person::M);
  return p;
}

Person x = foo();
</code></pre>
<p>Klappt doch <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>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069452</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 01 Jun 2006 10:47:14 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 10:56:26 GMT]]></title><description><![CDATA[<p>Das ist doch, sofern ich richtig schaue, derselbe Code, wie in meinem echten Beispiel mit der Curvature.</p>
<p>Ne Klasse (<em>Person</em> bzw. <em>CurvatureInfo</em>) mit nem const Member,<br />
nen Konstruktor, wo dieser Member initialisiert wird,<br />
ne Methode (einer anderen Klasse - <em>foo()</em> bzw. <em>CUtils::CreateCurvature()</em>), die ein neues Objekt erzeugt und<br />
ne (lokale) Variable (einer dritten Klasse), die dieses Objekt empfängt (<em>Person x</em> bzw. <em>curvatures[i]</em>).</p>
<p>Warum klappt das denn bei mir nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069456</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Thu, 01 Jun 2006 10:56:26 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 11:03:49 GMT]]></title><description><![CDATA[<p>FelixManke schrieb:</p>
<blockquote>
<p>Das ist doch, sofern ich richtig schaue, derselbe Code, wie in meinem echten Beispiel mit der Curvature.</p>
</blockquote>
<p>Keine Ahnung, hab deinen Code nicht gelesen.</p>
<blockquote>
<p>Ne Klasse (<em>Person</em> bzw. <em>CurvatureInfo</em>) mit nem const Member,<br />
nen Konstruktor, wo dieser Member initialisiert wird,</p>
</blockquote>
<p>nem Copy-Ctor und nem privat deklarierten op=.</p>
<p>Die Person x wird per Copy-Ctor mit dem Objekt, welches foo zurückgibt, initalisiert. Scharf, heh? <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>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069461</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 01 Jun 2006 11:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 11:57:36 GMT]]></title><description><![CDATA[<p>Oh sorry,</p>
<p>da habe ich vorhin nicht genau genug geguckt und das mit dem operator= übersehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    />. Sorry.</p>
<p>Scharf ist's wirklich. Wieso gibt sich denn der Compiler plötzlich damit zufrieden, wenn er GAR keinen Zuweisungsoperator mehr hat. Wie kommt der denn auf die Idee, plötzlich den Copy-Konstruktor zu nehmen?! Sonderbar....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069494</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Thu, 01 Jun 2006 11:57:36 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 12:02:15 GMT]]></title><description><![CDATA[<p>Hallo GPC,</p>
<p>dein Beispiel entspricht aber nicht dem von FelixManke,<br />
da du den Copy-Konstruktor bei &quot;Person x = foo()&quot; aufrufst, während<br />
wie ich auch schon geschrieben habe, bei FelixManke's Programm der Zuweisungsoperator aufgerufen wird, d.h.</p>
<pre><code class="language-cpp">Person x;
x = foo();
</code></pre>
<p>wird auch NICHT funktionieren!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069498</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 01 Jun 2006 12:02:15 GMT</pubDate></item><item><title><![CDATA[Reply to const member und operator= on Thu, 01 Jun 2006 12:04:59 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Hallo GPC,</p>
<p>dein Beispiel entspricht aber nicht dem von FelixManke,</p>
</blockquote>
<p>behauptete ich ja auch nicht <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>
<blockquote>
<p>da du den Copy-Konstruktor bei &quot;Person x = foo()&quot; aufrufst, während<br />
wie ich auch schon geschrieben habe, bei FelixManke's Programm der Zuweisungsoperator aufgerufen wird, d.h.</p>
<pre><code class="language-cpp">Person x;
x = foo();
</code></pre>
<p>wird auch NICHT funktionieren!!!</p>
</blockquote>
<p>korrekt...</p>
<p>FelixManke schrieb:</p>
<blockquote>
<p>Scharf ist's wirklich. Wieso gibt sich denn der Compiler plötzlich damit zufrieden, wenn er GAR keinen Zuweisungsoperator mehr hat. Wie kommt der denn auf die Idee, plötzlich den Copy-Konstruktor zu nehmen?! Sonderbar....</p>
</blockquote>
<p>...dazu folgendes Beispiel:</p>
<pre><code class="language-cpp">std::string s(&quot;&quot;);  //Ctor

std::string s2(s);  //Copy-Ctor
std::string s3 = s;  //Copy-Ctor, oha.

std::string s4;
s4 = s;  //Zuweisungs operator
</code></pre>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069502</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 01 Jun 2006 12:04:59 GMT</pubDate></item></channel></rss>