<?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[was ist an klassendefinition falsch?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche mich gerade mit C++ anzufreunden, verstehe aber die Fehlermeldungen überhaupt nicht. Laut Tutorials sollte es eigentlich gehen, wenn ich es richtig verstanden habe. Habe ich aber offensichtlich nicht. Könnt ihr mir helfen? Worum gehts: Ich will ne abstrakte Oberklasse, ASTExpression, von der dann ASTAndExpression und ASTOrExpression erben. Ich versuche es wie folgt:</p>
<p>Datei astExpression.h</p>
<pre><code class="language-cpp">namespace AST{

class ASTExpression {
public:

    ASTExpression(const ASTExpression&amp; orig);
    virtual ~ASTExpression();

    virtual ExpressionType getType()        = 0;
    virtual void addLeft(ASTExpression e)   = 0;
    virtual void addRight(ASTExpression e)  = 0;
    virtual void addTerm(ASTExpression e)   = 0;

    virtual ASTExpression getLeft() const   = 0;
    virtual ASTExpression getRight() const  = 0;
    virtual ASTExpression getTerm() const   = 0;

private:
    ASTExpression();
};

}//End namespace AST
</code></pre>
<p>Datei astOrExpression.h</p>
<pre><code class="language-cpp">namespace AST {

class ASTOrExpression : public ASTExpression {

public:

    ASTOrExpression();
    ASTOrExpression(const ASTOrExpression&amp; orig);
    virtual ~ASTOrExpression();

private:

    ASTExpression left;
    ASTExpression right;

};
}//End namespace AST
</code></pre>
<p>Datei astOrExpression.cpp</p>
<pre><code class="language-cpp">#include &quot;astOrExpression.h&quot;

using AST;

ASTOrExpression::ASTOrExpression() {
}

ASTOrExpression::ASTOrExpression(const ASTOrExpression&amp; orig) {
}

ASTOrExpression::~ASTOrExpression() {
}
</code></pre>
<p>Die Fehlermeldungen lass ich mal weg, es sind einfach zu viele ...</p>
<p>Vielen Dank<br />
uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/237490/was-ist-an-klassendefinition-falsch</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 05:14:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237490.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 Mar 2009 17:07:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 17:07:27 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche mich gerade mit C++ anzufreunden, verstehe aber die Fehlermeldungen überhaupt nicht. Laut Tutorials sollte es eigentlich gehen, wenn ich es richtig verstanden habe. Habe ich aber offensichtlich nicht. Könnt ihr mir helfen? Worum gehts: Ich will ne abstrakte Oberklasse, ASTExpression, von der dann ASTAndExpression und ASTOrExpression erben. Ich versuche es wie folgt:</p>
<p>Datei astExpression.h</p>
<pre><code class="language-cpp">namespace AST{

class ASTExpression {
public:

    ASTExpression(const ASTExpression&amp; orig);
    virtual ~ASTExpression();

    virtual ExpressionType getType()        = 0;
    virtual void addLeft(ASTExpression e)   = 0;
    virtual void addRight(ASTExpression e)  = 0;
    virtual void addTerm(ASTExpression e)   = 0;

    virtual ASTExpression getLeft() const   = 0;
    virtual ASTExpression getRight() const  = 0;
    virtual ASTExpression getTerm() const   = 0;

private:
    ASTExpression();
};

}//End namespace AST
</code></pre>
<p>Datei astOrExpression.h</p>
<pre><code class="language-cpp">namespace AST {

class ASTOrExpression : public ASTExpression {

public:

    ASTOrExpression();
    ASTOrExpression(const ASTOrExpression&amp; orig);
    virtual ~ASTOrExpression();

private:

    ASTExpression left;
    ASTExpression right;

};
}//End namespace AST
</code></pre>
<p>Datei astOrExpression.cpp</p>
<pre><code class="language-cpp">#include &quot;astOrExpression.h&quot;

using AST;

ASTOrExpression::ASTOrExpression() {
}

ASTOrExpression::ASTOrExpression(const ASTOrExpression&amp; orig) {
}

ASTOrExpression::~ASTOrExpression() {
}
</code></pre>
<p>Die Fehlermeldungen lass ich mal weg, es sind einfach zu viele ...</p>
<p>Vielen Dank<br />
uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687875</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Sun, 29 Mar 2009 17:07:27 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 17:16:18 GMT]]></title><description><![CDATA[<p>Fehlermeldung weglassen ist nicht hilfreich, dann nur die erste..</p>
<p>wie auch immer, kommst du von C#?</p>
<pre><code class="language-cpp">using namespace AST;
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">using AST::ASTExpression;
</code></pre>
<p>bzw.</p>
<pre><code class="language-cpp">using AST::ASTOrExpression;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1687877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687877</guid><dc:creator><![CDATA[JustAnotherNoob]]></dc:creator><pubDate>Sun, 29 Mar 2009 17:16:18 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 17:15:50 GMT]]></title><description><![CDATA[<p>uwerothfeld schrieb:</p>
<blockquote>
<p>Die Fehlermeldungen lass ich mal weg, es sind einfach zu viele ...</p>
</blockquote>
<p>Ähm - nein! Ich bin mir fast sicher, dass in den Fehlermeldungen genau steht, wo der Fehler liegt. Zudem raten wir nicht besonders gerne.</p>
<p>Rein virtuelle Methoden müssen in abgeleiteten Klassen implementiert werden, wenn diese nicht abstrakt sein sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687878</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Mar 2009 17:15:50 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 17:27:19 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also ich komme von Java ;). Mittels des namespace versuche ich sowas wie packages zu definieren, geht dies auch anders? Hier die gewünschten Fehlermeldungen:</p>
<pre><code>g++    -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/source/ast/astOrExpression.o.d -o build/Debug/GNU-Linux-x86/source/ast/astOrExpression.o source/ast/astOrExpression.cpp
In file included from source/ast/astOrExpression.h:12,
                 from source/ast/astOrExpression.cpp:9:
source/ast/astExpression.h:23: Fehler: Parameter »e« kann nicht als vom abstrakten Typ »AST::ASTExpression« deklariert werden
source/ast/astExpression.h:16: Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »AST::ASTExpression«:
source/ast/astExpression.h:22: Anmerkung:         virtual ExpressionType AST::ASTExpression::getType()
source/ast/astExpression.h:23: Anmerkung:         virtual void AST::ASTExpression::addLeft(AST::ASTExpression)
source/ast/astExpression.h:24: Anmerkung:         virtual void AST::ASTExpression::addRight(AST::ASTExpression)
source/ast/astExpression.h:25: Anmerkung:         virtual void AST::ASTExpression::addTerm(AST::ASTExpression)
source/ast/astExpression.h:27: Anmerkung:         virtual AST::ASTExpression AST::ASTExpression::getLeft() const
source/ast/astExpression.h:28: Anmerkung:         virtual AST::ASTExpression AST::ASTExpression::getRight() const
source/ast/astExpression.h:29: Anmerkung:         virtual AST::ASTExpression AST::ASTExpression::getTerm() const
source/ast/astExpression.h:24: Fehler: Parameter »e« kann nicht als vom abstrakten Typ »AST::ASTExpression« deklariert werden
source/ast/astExpression.h:16: Anmerkung:   denn der Typ »AST::ASTExpression« hat rein virtuelle Funktionen
source/ast/astExpression.h:25: Fehler: Parameter »e« kann nicht als vom abstrakten Typ »AST::ASTExpression« deklariert werden
source/ast/astExpression.h:16: Anmerkung:   denn der Typ »AST::ASTExpression« hat rein virtuelle Funktionen
source/ast/astExpression.h:27: Fehler: ungültiger abstrakter Rückgabetyp für Elementfunktion »virtual AST::ASTExpression AST::ASTExpression::getLeft() const«
source/ast/astExpression.h:16: Anmerkung:   denn der Typ »AST::ASTExpression« hat rein virtuelle Funktionen
source/ast/astExpression.h:28: Fehler: ungültiger abstrakter Rückgabetyp für Elementfunktion »virtual AST::ASTExpression AST::ASTExpression::getRight() const«
source/ast/astExpression.h:16: Anmerkung:   denn der Typ »AST::ASTExpression« hat rein virtuelle Funktionen
source/ast/astExpression.h:29: Fehler: ungültiger abstrakter Rückgabetyp für Elementfunktion »virtual AST::ASTExpression AST::ASTExpression::getTerm() const«
source/ast/astExpression.h:16: Anmerkung:   denn der Typ »AST::ASTExpression« hat rein virtuelle Funktionen
In file included from source/ast/astOrExpression.cpp:9:
source/ast/astOrExpression.h:25: Fehler: Feld »AST::ASTOrExpression::left« kann nicht als vom abstrakten Typ »AST::ASTExpression« deklariert werden
source/ast/astExpression.h:16: Anmerkung:   denn der Typ »AST::ASTExpression« hat rein virtuelle Funktionen
source/ast/astOrExpression.h:26: Fehler: Feld »AST::ASTOrExpression::right« kann nicht als vom abstrakten Typ »AST::ASTExpression« deklariert werden
source/ast/astExpression.h:16: Anmerkung:   denn der Typ »AST::ASTExpression« hat rein virtuelle Funktionen
source/ast/astOrExpression.cpp:10: Fehler: expected nested-name-specifier before »AST«
source/ast/astOrExpression.cpp:10: Fehler: namespace »AST« in »using«-Deklaration nicht erlaubt
source/ast/astOrExpression.cpp:12: Fehler: »ASTOrExpression« wurde nicht deklariert
source/ast/astOrExpression.cpp:12: Fehler: ISO-C++ verbietet Deklaration von »ASTOrExpression« ohne Typ
source/ast/astOrExpression.cpp:15: Fehler: »ASTOrExpression« is not a class or namespace
source/ast/astOrExpression.cpp:15: Fehler: expected »,« or »...« before »&amp;« token
source/ast/astOrExpression.cpp:15: Fehler: ISO-C++ verbietet Deklaration von »ASTOrExpression« ohne Typ
source/ast/astOrExpression.cpp:15: Fehler: ISO-C++ verbietet Deklaration von »ASTOrExpression« ohne Typ
source/ast/astOrExpression.cpp:18: Fehler: expected constructor, destructor, or type conversion before »::« token
make[2]: *** [build/Debug/GNU-Linux-x86/source/ast/astOrExpression.o] Fehler 1
make[2]: Leaving directory `/NetBeansProjects/qep-creation'
make[1]: *** [.build-conf] Fehler 2
make[1]: Leaving directory `/NetBeansProjects/qep-creation'
make: *** [.build-impl] Fehler 2
</code></pre>
<p>Ich danke schon einmal.<br />
Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687882</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Sun, 29 Mar 2009 17:27:19 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 17:36:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Parameter »e« kann nicht als vom abstrakten Typ »AST::ASTExpression« deklariert werden</p>
</blockquote>
<p>Ist diese fehlermeldung nicht ein interessanter hinweis?<br />
Er versucht ein ASTExpression Objekt zu erstellen - was er natuerlich nicht kann, da ASTExpression ja abstrakt ist.</p>
<p>Vergleiche dazu mal folgende 2 Funktionen und sage uns wo der unterschied zwischen foo und bar liegt...</p>
<pre><code class="language-cpp">class C {};

void foo(C c) {}
void bar(C const&amp; c) {}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1687887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687887</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 29 Mar 2009 17:36:03 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 17:43:45 GMT]]></title><description><![CDATA[<p>Hi Shade Of Mine,</p>
<p>ich rate mal: Rein lesender Zugriff auf ne Referenz c vom Typ C? Vielleicht noch ne Erklärung zu meiner Umgebung: Ich muß Code für einen Simulatpr entwickeln, welcher später (nach der Simulation) in einem System ohne malloc und Co ausgeführt werden soll. Daher will ich wirklich Objekte vom Typ ASTExpression in der Klasse speichern und keine Referenzen. Oder geht es irgendwie besser und ich habe nur einen Gedankenfehler???</p>
<p>mfg<br />
uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687889</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Sun, 29 Mar 2009 17:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 18:17:52 GMT]]></title><description><![CDATA[<p>Es geht darum, dass die Funktion</p>
<pre><code class="language-cpp">virtual void addLeft(ASTExpression e)   = 0;
</code></pre>
<p>und einige andere eine <code>ASTExpression</code> per Value übernehmen. Das heisst, diese muss kopiert werden. Das impliziert eine Konstruktion, was bei abstrakten Klassen nicht möglich ist.</p>
<p>Also übergib <code>e</code> als (Const-)Referenz, dann wird durch Polymorphie automatisch die richtige abgeleitete Klasse ausgewählt. Diese darf dann aber nicht mehr abstrakt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687908</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Mar 2009 18:17:52 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 21:17:23 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>erst einmal danke für die viele Hilfe. Mein Ergebnis ist nun:</p>
<p>Datei astExpression.h</p>
<pre><code class="language-cpp">namespace AST{

class ASTExpression {
public:

    ASTExpression() {};
    ASTExpression(const ASTExpression&amp; orig);
    ~ASTExpression() {};

    virtual ExpressionType getType()                = 0;
    virtual void addLeft(const ASTExpression&amp; e)    = 0;
    virtual void addRight(const ASTExpression&amp; e)   = 0;
    virtual void addTerm(const ASTExpression&amp; e)    = 0;

    virtual ASTExpression* getLeft() const   = 0;
    virtual ASTExpression* getRight() const  = 0;
    virtual ASTExpression* getTerm() const   = 0;

private:

};

}//End namespace AST
</code></pre>
<p>Datei astOrExpression.h</p>
<pre><code class="language-cpp">#include &quot;astExpression.h&quot;

namespace AST {

class ASTOrExpression : public ASTExpression {

public:

    ASTOrExpression();
    ASTOrExpression(const ASTOrExpression&amp; orig);
    virtual ~ASTOrExpression();

    virtual ExpressionType getType()                = 0;
    virtual void addLeft(const ASTExpression&amp; e)    = 0;
    virtual void addRight(const ASTExpression&amp; e)   = 0;
    virtual void addTerm(const ASTExpression&amp; e)    = 0;

    virtual ASTExpression* getLeft() const   = 0;
    virtual ASTExpression* getRight() const  = 0;
    virtual ASTExpression* getTerm() const   = 0;

private:

//    ASTExpression left;
//    ASTExpression right;

};

}//End namespace AST
</code></pre>
<p>Datei astOrExpression.cpp</p>
<pre><code class="language-cpp">#include &quot;astOrExpression.h&quot;
#include &lt;stdlib.h&gt;

using namespace AST;

ASTOrExpression::ASTOrExpression() {
}

ASTOrExpression::ASTOrExpression(const ASTOrExpression&amp; orig) {
}

ASTOrExpression::~ASTOrExpression() {
}

ExpressionType ASTOrExpression::getType(){
    return DSM_EXPRESSION_OR;
}

void ASTOrExpression::addLeft(const ASTExpression&amp; e){
//    left = e;
}

void ASTOrExpression::addRight(const ASTExpression&amp; e){
//    right = e;
}

void ASTOrExpression::addTerm(const ASTExpression&amp; e){
}

ASTExpression* ASTOrExpression::getLeft() const {
//    return &amp;left;
}

ASTExpression* ASTOrExpression::getRight() const {
//    return &amp;right;
}

ASTExpression* ASTOrExpression::getTerm() const  {
    return NULL;
}
</code></pre>
<p>So schön, so gut. Damit habe ich erst einmal keine Fehler. Nun will ich aber sagen, dass ein OrExpression halt wieder ein linken und rechten Ausdruck haben kann, vom Typ ASTExpression. Wenn ich nun aber in Datei astOrExpression die Zeilen 24,25 wieder einfüge, kommt:</p>
<pre><code>In file included from source/ast/astOrExpression.cpp:9:
source/ast/astOrExpression.h:34: Fehler: Feld »AST::ASTOrExpression::left« kann nicht als vom abstrakten Typ »AST::ASTExpression« deklariert werden
source/ast/astExpression.h:16: Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »AST::ASTExpression«:
source/ast/astExpression.h:23: Anmerkung:         virtual ExpressionType AST::ASTExpression::getType()
source/ast/astExpression.h:24: Anmerkung:         virtual void AST::ASTExpression::addLeft(const AST::ASTExpression&amp;)
source/ast/astExpression.h:25: Anmerkung:         virtual void AST::ASTExpression::addRight(const AST::ASTExpression&amp;)
source/ast/astExpression.h:26: Anmerkung:         virtual void AST::ASTExpression::addTerm(const AST::ASTExpression&amp;)
source/ast/astExpression.h:28: Anmerkung:         virtual AST::ASTExpression* AST::ASTExpression::getLeft() const
source/ast/astExpression.h:29: Anmerkung:         virtual AST::ASTExpression* AST::ASTExpression::getRight() const
source/ast/astExpression.h:30: Anmerkung:         virtual AST::ASTExpression* AST::ASTExpression::getTerm() const
source/ast/astOrExpression.h:35: Fehler: Feld »AST::ASTOrExpression::right« kann nicht als vom abstrakten Typ »AST::ASTExpression« deklariert werden
source/ast/astExpression.h:16: Anmerkung:   denn der Typ »AST::ASTExpression« hat rein virtuelle Funktionen
[.....]
Build failed. Exit value 2.
</code></pre>
<p>Da beißt sich doch die Katze in den Schwanz. Jemand noch nen Tip? Hier ist ja const nicht anwendbar, da ich ja auf left bzw. right schon schreibend zugreifen möchte (später).</p>
<p>Danke.<br />
Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687988</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Sun, 29 Mar 2009 21:17:23 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 21:36:16 GMT]]></title><description><![CDATA[<p>uwerothfeld schrieb:</p>
<blockquote>
<p>Da beißt sich doch die Katze in den Schwanz. Jemand noch nen Tip? Hier ist ja const nicht anwendbar, da ich ja auf left bzw. right schon schreibend zugreifen möchte (später).</p>
</blockquote>
<p><code>const</code> würde hier auch gar nichts bringen.</p>
<p>Wenn du von Java kommst, musst du in vielen Dingen umdenken. Ich würde dir raten, ein C++-Grundlagenbuch zu studieren, denn Java und C++ sind komplett verschiedene Sprachen, auch wenn sie einige Gemeinsamkeiten aufweisen. Gerade Zeiger, Speicherverwaltung, Operatorüberladung und Templates musst du auf jeden Fall neu lernen.</p>
<p>Dein Problem ist eben auch ein Denkfehler, der vermutlich von Java kommt.</p>
<pre><code class="language-cpp">ASTExpression left;
</code></pre>
<p>Das ist eine Deklaration eines <strong>Objekts</strong> (keine Referenz wie in Java) vom Typ <code>ASTExpression</code> . Dieser Typ ist aber abstrakt, somit können keine Objekte davon erzeugt werden. Was du brauchst, ist ein Zeiger, der auf abgeleitete Klassen verweist.</p>
<pre><code class="language-cpp">ASTExpression* left;
</code></pre>
<p>Und dann mit <code>new</code> und <code>delete</code> arbeiten. Schau dir am besten wie gesagt ein Buch an, dann lernst du solche Dinge. Oft empfohlene Bücher sind der C++-Primer und Thinking in C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687989</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Mar 2009 21:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 21:42:07 GMT]]></title><description><![CDATA[<p>Hallo Nexus,</p>
<p>Ok, dass habe ich verstanden. Dann werde ich mir morgen wohl mal ein Buch besorgen. Allerdings bleibt mein Problem, dass ich kein new/malloc verwenden kann (bietet das Zielsystem nicht). Kann ich in diesen Fall Polymorphie ganz abschreiben?</p>
<p>Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687990</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Sun, 29 Mar 2009 21:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 21:56:05 GMT]]></title><description><![CDATA[<p>uwerothfeld schrieb:</p>
<blockquote>
<p>Hallo Nexus,</p>
<p>Ok, dass habe ich verstanden. Dann werde ich mir morgen wohl mal ein Buch besorgen. Allerdings bleibt mein Problem, dass ich kein new/malloc verwenden kann (bietet das Zielsystem nicht). Kann ich in diesen Fall Polymorphie ganz abschreiben?</p>
<p>Uwe</p>
</blockquote>
<p>ja, kannst du...<br />
auf was für nem system arbeitest du denn dann? Oo</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687994</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 29 Mar 2009 21:56:05 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Sun, 29 Mar 2009 22:11:29 GMT]]></title><description><![CDATA[<p>uwerothfeld schrieb:</p>
<blockquote>
<p>Allerdings bleibt mein Problem, dass ich kein new/malloc verwenden kann (bietet das Zielsystem nicht). Kann ich in diesen Fall Polymorphie ganz abschreiben?</p>
</blockquote>
<p>Naja, du kannst &quot;Stack-Polymorphie&quot; anwenden, aber es ist fraglich, wie weit du damit kommst.</p>
<pre><code class="language-cpp">Base b;         // Basisklasse
Derived d;      // von Base abgeleitete Klasse

Base* pb = &amp;b;
Base* pd = &amp;d;

pb-&gt;Foo();      // ruft Base::Foo() auf (Foo ist virtuell)
pd-&gt;Foo();      // ruft Derived::Foo() auf
</code></pre>
<p>Aber wieso hast du <code>new</code> und <code>malloc</code> nicht? Ohne kannst du ja kaum programmieren. Du kannst nichts dynamisch machen. Keine Container, keine manuelle Speicherverwaltung... Das wäre nichts für mich. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1687997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687997</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Mar 2009 22:11:29 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Mon, 30 Mar 2009 05:18:44 GMT]]></title><description><![CDATA[<p>Natürlich kannst Du auch auf solchen Systemen mit Polymorphie arbeiten, wobei ich mir kaum vorstellen kann, dass es nicht zumindest new für Objekte gibt (auch wenn die nicht auf dem Heap abgelegt werden sollten). Ansonsten kann man immernoch Standardcontainer einsetzen, um Objekte zu halten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688018</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 30 Mar 2009 05:18:44 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Mon, 30 Mar 2009 05:55:49 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Ansonsten kann man immernoch Standardcontainer einsetzen, um Objekte zu halten.</p>
</blockquote>
<p>Was meinst du, wie die intern arbeiten? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>ohne new ist es zwar nicht vollkommen unmöglich, aber es erschwert die ganze sache natürlich ungemein - mir wären es zu viele einschränkungen, um das zu tun^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688026</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 30 Mar 2009 05:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Mon, 30 Mar 2009 07:58:45 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>erst einmal danke für eure zahlreichen Kommentare. Mein Zielsystem ist ein 8 MHz MSP430 mit 10 kB RAM und 48 kB Flash. Darauf läuft eine Art Runtime, welche ein C ohne malloc und Co bietet. Mein Algorithmus soll ich aber für einen C++ basierten Simulator schreiben, wobei aber keine Elemente zur Anwendung kommen, welche auf dem Zielsystem nicht verfügbar sind. Daher der Zwangsweise verzicht auf new, malloc und Co., die einzige pseudo Dynamic, welche mir zur Verfügung steht, ist ein BufferPool, welcher eine beschränkte Anzahl von Elementen eines bestimmten Listentypes bereitstellt.</p>
<p>Ist es ne gute Idee, die Expression erst zu zählen, dann lokal ein Pointerarray zu erstellen und dies dann zu verwenden für Stack based Polymorphismus?</p>
<p>uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688051</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Mon, 30 Mar 2009 07:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Mon, 30 Mar 2009 13:30:48 GMT]]></title><description><![CDATA[<p>wenn du eh einen pool hast, aus dem du &quot;fake&quot;-dynamischen speicher bekommen kannst, dann verwende placement new oder schreib einen eigenen operator new à la</p>
<pre><code class="language-cpp">static char dynamic_memory[1024];
size_t counter;

void* operator new (size_t s)
{
   if (counter + s &gt; 1024) 
     throw bad_alloc();
   else
   {
      counter += s;
      return dynamic_memory + counter - s;
   }
}
</code></pre>
<p>im prinzip.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688218</guid><dc:creator><![CDATA[verwirrt]]></dc:creator><pubDate>Mon, 30 Mar 2009 13:30:48 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Mon, 30 Mar 2009 14:02:57 GMT]]></title><description><![CDATA[<blockquote>
<p>Zielsystem ist ein 8 MHz MSP430 mit 10 kB RAM und 48 kB Flash. Darauf läuft eine Art Runtime, welche ein C ohne malloc und Co</p>
</blockquote>
<p>That's hard. Selbst arbeite ich grade an einem Scheme Interpreter fuer den embedded Bereich. C++ und Polymorphie kann ich dort aber auch nicht nutzen (so gern ich es taete). Die Allgemeine Struktur eines jeden Elements sieht etwa so aus (frei aus tinyscheme kopiert):</p>
<pre><code class="language-cpp">/* cell structure */
struct cell {
  unsigned int _flag;
  union {
    struct {
      char   *_svalue;
      int   _length;
    } _string;
    num _number;
    port *_port;
    foreign_func _ff;
    struct {
      struct cell *_car;
      struct cell *_cdr;
    } _cons;
  } _object;
};
</code></pre>
<p>Das _flag gibt den Typ an (String, Number, Symbol, Pair, ...). Daraus sind dann alle anderen Elemente wie Listen oder Baeume aufgebaut. Es ist mit automatischem memory management und man erhaelt mittels get_cell aus dem Pool von Zellen eine neue. Es ist das Aequivalent zu new. Auch muss die Runtime etwas aequivalentes wie malloc und Co. anbieten. Ansonsten muss man sich seinen eigenen memory manager fuer die 10kByte Ram schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688238</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 30 Mar 2009 14:02:57 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Tue, 31 Mar 2009 11:09:37 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also die Geschichte mit dem eigenen new finde ich wirklich witzig. Da muß ich doch in der Tat mal schauen, ob ich das nicht verwenden kann. Mein Betreuer will, dass ich alles statisch definiere, was damit ja im Prinzip auch erfüllt wäre, aber dennoch einiges an Lebenserleichterung bringen würde.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a><br />
So ein &quot;Monster&quot; habe ich bis jetzt im alten C basierten Simulator verwendet. Ich hatte allerdings gehofft, die Welt ein bisschen schöner zu machen. Was ich bei deinen Ansatz aber nicht versteh sind zwei Dinge:</p>
<ol>
<li>
<p>Wo legt du die Verweise auf die Blätter ab? In car und cdr?</p>
</li>
<li>
<p>Wie und wo erzeugst du die Cellen statisch und legst diese ab? Über den Pool?</p>
</li>
</ol>
<p>uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688698</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Tue, 31 Mar 2009 11:09:37 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Tue, 31 Mar 2009 11:46:37 GMT]]></title><description><![CDATA[<p>uwerothfeld schrieb:</p>
<blockquote>
<ol>
<li>Wo legt du die Verweise auf die Blätter ab? In car und cdr?</li>
<li>Wie und wo erzeugst du die Cellen statisch und legst diese ab? Über den Pool?</li>
</ol>
</blockquote>
<p>zu 1) Jein. Scheme ist etwas anders. Z.B. ist (+ 1 2) ein Befehl zur Addition und wird in einer einfachen Liste gespeichert. car hat einen Zeiger auf eine Zelle vom Typ Symbol (+) und cdr enthaelt einen Pointer auf den Rest der Liste. (Ich empfehle dir aber eine Einfuehrung in Lisp/Scheme zu lesen, hier kann ich so schlecht Bildchen malen.) Ein Versuch:</p>
<pre><code>[car|cdr]---[car|cdr]---[car|/]
  |           |           |
  Symbol      Number      Number
   name: +     value: 1    value: 2
</code></pre>
<p>Waehrend [/] ein Verweis auf das Nullelement ist und den Abschluss einer Liste kennzeichnet. Mit diesen rudimentaeren Konstrukten koennen alle moeglichen Expressions gebaut werden.</p>
<p>zu 2) Neue Elemente werden mit z.B. cons oder mk_number konstruiert, sie Rufen get_cell auf und fordern vom Pool (beim Start initialisiert) eine freie Zelle an. Dazu Verweise ich aber erstmal auf den (haesslichen) Sourcecode von Minischeme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688746</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 31 Mar 2009 11:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Tue, 31 Mar 2009 11:55:22 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich glaube ich habe verstanden <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>uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688752</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Tue, 31 Mar 2009 11:55:22 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Tue, 31 Mar 2009 13:42:41 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>ich habe nun meine Klasse ergänzt um:</p>
<pre><code class="language-cpp">//define a list to store all expressions
    static ASTExpression expressionList[DSM_EXPRESSION_CNT_MAX];

    //this index points to the next free element in the storage
    static size_t expressionlistIndex = 0;
</code></pre>
<p>sowie</p>
<pre><code class="language-cpp">/**
 * Overload the new operator to simulate dynamic memory allocation.
 */
static void* ASTExpression::operator new (size_t size){

    if(expressionlistIndex + size &gt; DSM_EXPRESSION_CNT_MAX){
        throw bad_alloc();
    }//End if
    else {
        expressionListIndex += size;
        return expressionList + expressionListIndex - size;

   }//End else
}//End operator new
</code></pre>
<p>Allerdings bekomme ich als Fehler:</p>
<pre><code>In file included from source/tinyDSMMain.cpp:12:
source/ast/astexpression.h:118: Fehler: ISO-C++ verbietet Initialisierung des nicht konstanten statischen Elements »expressionlistIndex« in der Klasse
</code></pre>
<p>Aber den Index auf den Speicher muß ich doch global initialisieren, da er ja für alle Objekte gilt. Wo ist mein Denkfehler????</p>
<p>Danke nochmal.<br />
Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688823</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Tue, 31 Mar 2009 13:42:41 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Tue, 31 Mar 2009 13:49:49 GMT]]></title><description><![CDATA[<p>Die Initialisierung der statischen Elemente muss außerhalb der Klasse (in der cpp) erfolgen. Genau das sagt der Compiler ja auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688830</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 31 Mar 2009 13:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Tue, 31 Mar 2009 13:55:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">static size_t expressionlistIndex
</code></pre>
<p>Probier' es mit</p>
<pre><code class="language-cpp">size_t ASTExpression::expressionlistIndex = 0;
</code></pre>
<p>in der Cpp-Datei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688836</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 31 Mar 2009 13:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Tue, 31 Mar 2009 14:18:29 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ah, so gehts! Fein. Jetzt habe ich nur noch nen letztes Problem. Ich bekomme in der Zeile:</p>
<pre><code class="language-cpp">return expressionList + expressionListIndex - size;
</code></pre>
<p>folgenden Fehler:</p>
<blockquote>
<p>/source/ast/astexpression.cpp:179: undefined reference to `AST::ASTExpression::expressionList'</p>
</blockquote>
<p>Was mach ich den falsch (expressionlist habe ich nochmal umbenannt nach expressionList)? Noch nen Tipp??<br />
Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688839</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Tue, 31 Mar 2009 14:18:29 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Tue, 31 Mar 2009 14:18:43 GMT]]></title><description><![CDATA[<p>ASTExpression::expressionList ist ja ebenfalls static. Du hast es bisher nur deklariert (in der Klassendeklaration). Du brauchst auch hier noch eine Definition in der cpp.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688847</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 31 Mar 2009 14:18:43 GMT</pubDate></item><item><title><![CDATA[Reply to was ist an klassendefinition falsch? on Tue, 31 Mar 2009 14:22:03 GMT]]></title><description><![CDATA[<p>Hi zum letzten ;),</p>
<p>nun habe ich in der .h:</p>
<pre><code class="language-cpp">//define a list to store all expressions
    static ASTExpression expressionList[DSM_EXPRESSION_CNT_MAX];

    //this index points to the next free element in the storage
    static size_t expressionListIndex;
</code></pre>
<p>und in der .cpp:</p>
<pre><code class="language-cpp">//init the static counter for the simulated dynamic storage allocation
size_t ASTExpression::expressionListIndex = 0;
ASTExpression ASTExpression::expressionList[DSM_EXPRESSION_CNT_MAX];
</code></pre>
<p>Ist das nicht doppeltgemommelt bzgl. der expressionList???</p>
<p>Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688849</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Tue, 31 Mar 2009 14:22:03 GMT</pubDate></item></channel></rss>