<?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[Konstruktoren und Klassenhierarchie]]></title><description><![CDATA[<p>Hi:)<br />
mein Problem ist, dass der Compiler meine rabatt=10.0 in der Elementinitialisiererliste von FlacheObjekte nicht akzeptiert.<br />
Danke für die Hilfe schonmal!!</p>
<pre><code class="language-cpp">class Kunstwerke
{
public:
	virtual ~Kunstwerke();
	virtual void drucke(ostream&amp;)const=0;
protected:
	Kunstwerke(string,double,double*);
	Kunstwerke::Kunstwerke(const Kunstwerke&amp;);
	Kunstwerke&amp; operator=(const Kunstwerke&amp;);
	string name;
	double preis;
	double *rabatt;
};

class FlacheObjekte:public Kunstwerke

class Gemaelde:public FlacheObjekte

class Graphiken:public FlacheObjekte

//Kunstwerke

Kunstwerke::Kunstwerke(string n,double p,double* r)
{
	name=n;
	preis=p;
	if(rabatt!=0)delete[]rabatt;
	rabatt=new double[sizeof(r)];
	rabatt=r;
}

//FlacheObjekte
</code></pre>
<p>Problem:</p>
<pre><code class="language-cpp">FlacheObjekte::FlacheObjekte(int l,int b):Kunstwerke(&quot;See&quot;,39.9,10.0)
{
	laenge=l;breite=b;
}
</code></pre>
<pre><code class="language-cpp">//Gemaelde

//Graphiken
Graphiken::~Graphiken(){cout&lt;&lt;&quot;Gr&quot;&lt;&lt;endl;}
Graphiken::Graphiken(int t):FlacheObjekte(50,50)
{
	typ=t;
}

int main()
{
	Kunstwerke* feld[2];
	feld[0]=new Gemaelde(1876);
	feld[1]=new Graphiken(7);

	for(int i=0;i&lt;2;i++)
		cout&lt;&lt;feld[i]&lt;&lt;endl;

	cin.get();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/258970/konstruktoren-und-klassenhierarchie</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 00:50:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258970.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Jan 2010 17:35:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Sun, 17 Jan 2010 17:35:17 GMT]]></title><description><![CDATA[<p>Hi:)<br />
mein Problem ist, dass der Compiler meine rabatt=10.0 in der Elementinitialisiererliste von FlacheObjekte nicht akzeptiert.<br />
Danke für die Hilfe schonmal!!</p>
<pre><code class="language-cpp">class Kunstwerke
{
public:
	virtual ~Kunstwerke();
	virtual void drucke(ostream&amp;)const=0;
protected:
	Kunstwerke(string,double,double*);
	Kunstwerke::Kunstwerke(const Kunstwerke&amp;);
	Kunstwerke&amp; operator=(const Kunstwerke&amp;);
	string name;
	double preis;
	double *rabatt;
};

class FlacheObjekte:public Kunstwerke

class Gemaelde:public FlacheObjekte

class Graphiken:public FlacheObjekte

//Kunstwerke

Kunstwerke::Kunstwerke(string n,double p,double* r)
{
	name=n;
	preis=p;
	if(rabatt!=0)delete[]rabatt;
	rabatt=new double[sizeof(r)];
	rabatt=r;
}

//FlacheObjekte
</code></pre>
<p>Problem:</p>
<pre><code class="language-cpp">FlacheObjekte::FlacheObjekte(int l,int b):Kunstwerke(&quot;See&quot;,39.9,10.0)
{
	laenge=l;breite=b;
}
</code></pre>
<pre><code class="language-cpp">//Gemaelde

//Graphiken
Graphiken::~Graphiken(){cout&lt;&lt;&quot;Gr&quot;&lt;&lt;endl;}
Graphiken::Graphiken(int t):FlacheObjekte(50,50)
{
	typ=t;
}

int main()
{
	Kunstwerke* feld[2];
	feld[0]=new Gemaelde(1876);
	feld[1]=new Graphiken(7);

	for(int i=0;i&lt;2;i++)
		cout&lt;&lt;feld[i]&lt;&lt;endl;

	cin.get();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1840334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840334</guid><dc:creator><![CDATA[gypsygirl]]></dc:creator><pubDate>Sun, 17 Jan 2010 17:35:17 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Sun, 17 Jan 2010 22:23:30 GMT]]></title><description><![CDATA[<p>Wie wärs mit</p>
<ul>
<li>korrektem Sourcecode (bis auf deinen Fehler),</li>
<li>der wörtlichen Fehlermeldung,</li>
<li>nur dem für das Problem relevanten Teil?</li>
</ul>
<p>Sonst wird das hier wieder eine Rumraterei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840494</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 17 Jan 2010 22:23:30 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Sun, 17 Jan 2010 22:59:24 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Kunstwerke
{
public:
	virtual ~Kunstwerke();
	virtual void drucke(ostream&amp;)const=0;
protected:
	Kunstwerke(string,double,double*);            // Hier wird ein Zeiger auf Double übergeben ...
	Kunstwerke::Kunstwerke(const Kunstwerke&amp;);
	Kunstwerke&amp; operator=(const Kunstwerke&amp;);
	string name;
	double preis;
	double *rabatt;
};
</code></pre>
<pre><code class="language-cpp">FlacheObjekte::FlacheObjekte(int l,int b):Kunstwerke(&quot;See&quot;,39.9,10.0)        // ... und hier eben ein double und kein Zeiger auf double
{
	laenge=l;breite=b;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1840513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840513</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 17 Jan 2010 22:59:24 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 09:23:32 GMT]]></title><description><![CDATA[<p>Danke für die Antworten:)<br />
also ich möchte mein Objekt über Parameter initialisieren, was setze ich denn ein wenn ein Zeiger erwartet wird?(10.0 wird nicht akzeptiert)<br />
Meldung:<br />
error C2664: 'Gemaelde::Gemaelde(std::string,double,double *,int,int,int)' : cannot convert parameter 3 from 'double' to 'double *'</p>
<p>main:</p>
<pre><code class="language-cpp">Kunstwerke* feld[2];
     feld[0]=new Gemaelde(&quot;See&quot;,39.9,10.0,30,40,1876);
</code></pre>
<p>hab an den Elementinitialisiererlisten noch etwas verbessert:</p>
<pre><code class="language-cpp">Graphiken::Graphiken(string n,double p,double* r,int l,int b,int t):FlacheObjekte(n,p,r,l,b),typ(t){}
</code></pre>
<p>in der abstrakten BK soll das Feld rabatt dynamisch angelegt werden:</p>
<pre><code class="language-cpp">Kunstwerke::Kunstwerke(string n,double p,double* r)
{
	name=n;
	preis=p;
	if(rabatt!=0)delete[]rabatt;
	rabatt=new double[];
	rabatt=r;
}
</code></pre>
<p>ich nehme an im Konstrukor ist was falsch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840619</guid><dc:creator><![CDATA[gypsygirl]]></dc:creator><pubDate>Mon, 18 Jan 2010 09:23:32 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 09:25:49 GMT]]></title><description><![CDATA[<p>Eine Anmerkung: Der Konstruktor von Graphiken ist derselbe wie von Gemaelde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840621</guid><dc:creator><![CDATA[gypsygirl]]></dc:creator><pubDate>Mon, 18 Jan 2010 09:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 09:32:56 GMT]]></title><description><![CDATA[<p>Wieso soll der Rabatt überhaupt ein Zeiger auf ein <code>double</code> sein? Mach doch daraus einen normalen Wert und keinen Zeiger ...</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840625</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 18 Jan 2010 09:32:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 09:39:03 GMT]]></title><description><![CDATA[<p>in der Aufgabenstellung steht, dass man eine Rabattstaffel anlegen soll und zwar als dynamisches Feld ...<br />
ansonsten würd ich das auch sofort ändern:)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840627</guid><dc:creator><![CDATA[gypsygirl]]></dc:creator><pubDate>Mon, 18 Jan 2010 09:39:03 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 10:04:55 GMT]]></title><description><![CDATA[<p>Hmmm, also zuerst mal vielleicht zu deinem Kunstwerk Konstruktor:</p>
<pre><code class="language-cpp">Kunstwerke::Kunstwerke(string n,double p,double* r) 
{ 
    name=n; 
    preis=p; 
    if(rabatt!=0)delete[]rabatt;  // Unnötig und gefährlich. (1)
    rabatt=new double[sizeof(r)]; // Wird immer von der Grösse 4 oder 8 sein. (2)
    rabatt=r;                     // Erzeugt ein Speicherleck. (3)
}
</code></pre>
<p>(1) Wenn du ein Objekt konstruierst, dann zeigt rabatt ja noch auf keinen Speicher, daher muss du keinen löschen. Was aber sein kann ist, dass rabatt irgendeinen Wert hat, da er uninitializiert ist, wodurch du am Ende versuchen könntest, irgendwo Speicher freizugeben, der dir gar nicht gehört. Folge: Undefiniertes Verhalten.<br />
(2) r ist ein Zeiger und auf einem x86 System ist dieser 4, bzw. auf einem x64 System 8, Bytes gross. Und genau das ist es, was sizeof dir zurückgeben wird. Wenn du die Grösse des Arrays wissen willst, dann musst du die Grösse im Konstruktor mitübergeben.<br />
(3) Durch new double[...] hast du Speicher reserviert und den Zeiger darauf in rabatt gespeichert. Nun überschreibst du diesen Zeiger mit dem Zeiger r. Dadurch verlierst du jeglichen Zeiger auf deinen gleich davor reservierten Speicher und hast ein Speicherleck, da du den nicht mehr freigeben kannst. Wahrscheinlich wolltest du hier das Array, welches sich dahinter versteckt, kopieren. Nur weiss der Kompiler nichts davon, er sieht nur einen Zeiger auf einen einzelnen Double-Wert.</p>
<p>Allgemein: Du solltest nochmals den Teil über Zeiger &amp; Arrays durchlesen. Dringend!</p>
<p>Zu deiner Rabattstaffel an sich:<br />
Wie soll die denn genau implementiert werden? Also wie entscheided das Objekt, wann welcher Rabatt genommen werden soll?</p>
<p>In der Intialisierungsliste kann man kein Array mit Defaultwerten erstellen und übergeben. Also müsste man dies sowieso ein wenig anders lösen, als wie du es vorgehabt hast.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840637</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 18 Jan 2010 10:04:55 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 10:56:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Kunstwerke(string,double,double*);
</code></pre>
<p>Ich würde zum besseren Vertändniss den Variablennamen mit angeben. Das wird ungeahnte Vorteile für den späteren Endbenutzer/Leser haben wenn er mit deinem Code arbeiten möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840659</guid><dc:creator><![CDATA[Kóyaánasqatsi@logged_off]]></dc:creator><pubDate>Mon, 18 Jan 2010 10:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 11:47:40 GMT]]></title><description><![CDATA[<p>danke...also zu (2)und(3): wie find ich denn die Größe von r raus?<br />
wenn ich die hätte könnte ich mit einer for-Schleife arbeiten<br />
und jedes Element von r einzeln in rabatt kopieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840684</guid><dc:creator><![CDATA[gypsygirl]]></dc:creator><pubDate>Mon, 18 Jan 2010 11:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 11:49:58 GMT]]></title><description><![CDATA[<p>zu der Rabattstaffel steht in der Aufgabenstellung leider weiter nichts.<br />
Ich soll nur ein Objekt Gemaelde erstellen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840686</guid><dc:creator><![CDATA[gypsygirl]]></dc:creator><pubDate>Mon, 18 Jan 2010 11:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 11:52:08 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>gypsygirl schrieb:</p>
<blockquote>
<p>wie find ich denn die Größe von r raus?</p>
</blockquote>
<p>Wie bereits unter (2) gesagt wurde: Gar nicht! Musst du mit übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840687</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 18 Jan 2010 11:52:08 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoren und Klassenhierarchie on Mon, 18 Jan 2010 13:00:46 GMT]]></title><description><![CDATA[<p>is mir jetzt auch klargeworden...:)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840716</guid><dc:creator><![CDATA[gypsygirl]]></dc:creator><pubDate>Mon, 18 Jan 2010 13:00:46 GMT</pubDate></item></channel></rss>