<?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[Copyconstructor: obwohl ich eine definiere erzeugt der Compiler noch einen ???]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab hier eine vector klasse geschrieben, mit globalem op+ der auf op+= aufbaut. Hab in jede Funktion Ausgaben eingebaut um zu verstehen in welcher Reihenfolge da was passiert. Im op+ wird durch CopyCtor ein Objekt erzeugt, aber der CCtor meldet sich nicht wie meiner??? =&gt; der Compiler hat noch einen erzeugt?<br />
Kennt meinen nicht??<br />
Ich bin hier schon völlig an Ende.<br />
Das ist mein Code auf das wesentliche reduziert benutze gcc 3.3.5</p>
<pre><code class="language-cpp">using namespace std; 
typedef long int size_type;

template&lt;typename T&gt; class Vector{
    protected:
		T	*vectorPtr;
		size_type dim;
    public:
		Vector();
		Vector(size_type dim);
		Vector(size_type n, T initVal);
		template &lt;typename U&gt; Vector(const Vector&lt;U&gt; &amp;src);
		~Vector(){
			cerr &lt;&lt; &quot; Dtor Check\n&quot;;
			delete [] vectorPtr;
		}

		size_type length() const {return dim;}
		T* rootPtr() const {return vectorPtr;}
		void setCoutwidth(unsigned short i){coutwidth = i;}
		unsigned short getCoutwidth()const {return coutwidth;}

		Vector&lt;T&gt;&amp; operator=(const Vector&lt;T&gt; &amp;src);
		template &lt;typename U&gt; Vector&lt;T&gt;&amp; operator+=(const Vector&lt;U&gt; &amp;vec2);
};

template&lt;typename T&gt; Vector&lt;T&gt;::Vector(){
	cerr &lt;&lt; &quot; Standard Ctor Check\n&quot;;
	dim 		= 3;
	vectorPtr = new T[dim];
}

template&lt;typename T&gt; Vector&lt;T&gt;::Vector(size_type n, T initVal){
	cerr &lt;&lt; &quot; Ctor 2 Check\n&quot;;
	dim 		= n;
	vectorPtr = new T[dim];
	T *tmpPtr;
	for (tmpPtr = vectorPtr; tmpPtr - vectorPtr &lt; dim; ++tmpPtr) 
		*tmpPtr = initVal;
}

template&lt;typename T&gt; template &lt;typename U&gt; Vector&lt;T&gt;::Vector(const Vector&lt;U&gt; &amp;src){
	cerr &lt;&lt; &quot; Copy Ctor Check\n&quot;;
	dim 		= src.length();
	vectorPtr = new T[dim];
	U *srcPtr;
	T *tmpPtr;
	for (tmpPtr = vectorPtr, srcPtr = src.rootPtr(); tmpPtr - vectorPtr &lt; dim; ++tmpPtr, ++srcPtr)
		*tmpPtr = *srcPtr;
}

template&lt;typename T&gt; Vector&lt;T&gt;&amp; Vector&lt;T&gt;::operator=(const Vector&lt;T&gt; &amp;src){
	cerr &lt;&lt; &quot; op= Check\n&quot;;
	if (this != &amp;src){
		if (dim != src.dim){
			dim = src.dim;
			delete [] vectorPtr;
			vectorPtr = new T[dim];
		}
		T *srcPtr, *tmpPtr;
		for (tmpPtr = vectorPtr, srcPtr = src.vectorPtr; tmpPtr - vectorPtr &lt; dim; ++tmpPtr, ++srcPtr)
			*tmpPtr = *srcPtr;

	}
	return *this;
}

template&lt;typename T&gt; template &lt;typename U&gt; Vector&lt;T&gt;&amp; Vector&lt;T&gt;::operator+=(const Vector&lt;U&gt; &amp;vec2){
	cerr &lt;&lt; &quot; op+= Check\n&quot;;
	if (dim != vec2.length()){
		cerr &lt;&lt; &quot; for operator += dimension of vectors must confirm!\n&quot;;
		exit(1);
	}
	else{	
		U *vec2Ptr = vec2.rootPtr();
		T *tmpPtr;
		for (tmpPtr = vectorPtr; tmpPtr - vectorPtr &lt; dim; ++tmpPtr, ++vec2Ptr)
			*tmpPtr += *vec2Ptr;
	}
	return *this;
}

template&lt;typename T, typename U&gt; Vector&lt;T&gt; operator+(const Vector&lt;T&gt; &amp;vec1, const Vector&lt;U&gt; &amp;vec2){
	cerr &lt;&lt; &quot; op+ Check 1\n&quot;;
	if (vec1.length() != vec2.length()){
		cerr &lt;&lt; &quot; for operator + dimension of vectors must confirm!\n&quot;;
		exit(1);
	}
	cerr &lt;&lt; &quot; op+ Check 2\n&quot;;
	Vector&lt;T&gt; result(vec1);
	result += vec2;
	cerr &lt;&lt; &quot; op+ Check 3\n&quot;;
	return result;
}

int main(){
	int dim = 3;
	Vector&lt;float&gt; a(dim,1), b;
	Vector&lt;double&gt; c(a);
	cerr &lt;&lt; &quot; main Check 1\n&quot;;
	b = a + c;
	cerr &lt;&lt; &quot; main Check 2\n&quot;;
	return 0;
}
</code></pre>
<p>Das Programm erzeugt dann folgende Ausgabe:</p>
<pre><code>Ctor 2 Check
 Standard Ctor Check
 Copy Ctor Check
 main Check 1
 op+ Check 1
 op+ Check 2
 op+= Check
 op+ Check 3
 op= Check
 Dtor Check
 main Check 2
 Dtor Check
 Dtor Check
 Dtor Check
</code></pre>
<p>Weis jemand Rat? Bin am verzweifeln <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/135480/copyconstructor-obwohl-ich-eine-definiere-erzeugt-der-compiler-noch-einen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 00:10:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/135480.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 02 Feb 2006 13:52:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copyconstructor: obwohl ich eine definiere erzeugt der Compiler noch einen ??? on Thu, 02 Feb 2006 13:52:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab hier eine vector klasse geschrieben, mit globalem op+ der auf op+= aufbaut. Hab in jede Funktion Ausgaben eingebaut um zu verstehen in welcher Reihenfolge da was passiert. Im op+ wird durch CopyCtor ein Objekt erzeugt, aber der CCtor meldet sich nicht wie meiner??? =&gt; der Compiler hat noch einen erzeugt?<br />
Kennt meinen nicht??<br />
Ich bin hier schon völlig an Ende.<br />
Das ist mein Code auf das wesentliche reduziert benutze gcc 3.3.5</p>
<pre><code class="language-cpp">using namespace std; 
typedef long int size_type;

template&lt;typename T&gt; class Vector{
    protected:
		T	*vectorPtr;
		size_type dim;
    public:
		Vector();
		Vector(size_type dim);
		Vector(size_type n, T initVal);
		template &lt;typename U&gt; Vector(const Vector&lt;U&gt; &amp;src);
		~Vector(){
			cerr &lt;&lt; &quot; Dtor Check\n&quot;;
			delete [] vectorPtr;
		}

		size_type length() const {return dim;}
		T* rootPtr() const {return vectorPtr;}
		void setCoutwidth(unsigned short i){coutwidth = i;}
		unsigned short getCoutwidth()const {return coutwidth;}

		Vector&lt;T&gt;&amp; operator=(const Vector&lt;T&gt; &amp;src);
		template &lt;typename U&gt; Vector&lt;T&gt;&amp; operator+=(const Vector&lt;U&gt; &amp;vec2);
};

template&lt;typename T&gt; Vector&lt;T&gt;::Vector(){
	cerr &lt;&lt; &quot; Standard Ctor Check\n&quot;;
	dim 		= 3;
	vectorPtr = new T[dim];
}

template&lt;typename T&gt; Vector&lt;T&gt;::Vector(size_type n, T initVal){
	cerr &lt;&lt; &quot; Ctor 2 Check\n&quot;;
	dim 		= n;
	vectorPtr = new T[dim];
	T *tmpPtr;
	for (tmpPtr = vectorPtr; tmpPtr - vectorPtr &lt; dim; ++tmpPtr) 
		*tmpPtr = initVal;
}

template&lt;typename T&gt; template &lt;typename U&gt; Vector&lt;T&gt;::Vector(const Vector&lt;U&gt; &amp;src){
	cerr &lt;&lt; &quot; Copy Ctor Check\n&quot;;
	dim 		= src.length();
	vectorPtr = new T[dim];
	U *srcPtr;
	T *tmpPtr;
	for (tmpPtr = vectorPtr, srcPtr = src.rootPtr(); tmpPtr - vectorPtr &lt; dim; ++tmpPtr, ++srcPtr)
		*tmpPtr = *srcPtr;
}

template&lt;typename T&gt; Vector&lt;T&gt;&amp; Vector&lt;T&gt;::operator=(const Vector&lt;T&gt; &amp;src){
	cerr &lt;&lt; &quot; op= Check\n&quot;;
	if (this != &amp;src){
		if (dim != src.dim){
			dim = src.dim;
			delete [] vectorPtr;
			vectorPtr = new T[dim];
		}
		T *srcPtr, *tmpPtr;
		for (tmpPtr = vectorPtr, srcPtr = src.vectorPtr; tmpPtr - vectorPtr &lt; dim; ++tmpPtr, ++srcPtr)
			*tmpPtr = *srcPtr;

	}
	return *this;
}

template&lt;typename T&gt; template &lt;typename U&gt; Vector&lt;T&gt;&amp; Vector&lt;T&gt;::operator+=(const Vector&lt;U&gt; &amp;vec2){
	cerr &lt;&lt; &quot; op+= Check\n&quot;;
	if (dim != vec2.length()){
		cerr &lt;&lt; &quot; for operator += dimension of vectors must confirm!\n&quot;;
		exit(1);
	}
	else{	
		U *vec2Ptr = vec2.rootPtr();
		T *tmpPtr;
		for (tmpPtr = vectorPtr; tmpPtr - vectorPtr &lt; dim; ++tmpPtr, ++vec2Ptr)
			*tmpPtr += *vec2Ptr;
	}
	return *this;
}

template&lt;typename T, typename U&gt; Vector&lt;T&gt; operator+(const Vector&lt;T&gt; &amp;vec1, const Vector&lt;U&gt; &amp;vec2){
	cerr &lt;&lt; &quot; op+ Check 1\n&quot;;
	if (vec1.length() != vec2.length()){
		cerr &lt;&lt; &quot; for operator + dimension of vectors must confirm!\n&quot;;
		exit(1);
	}
	cerr &lt;&lt; &quot; op+ Check 2\n&quot;;
	Vector&lt;T&gt; result(vec1);
	result += vec2;
	cerr &lt;&lt; &quot; op+ Check 3\n&quot;;
	return result;
}

int main(){
	int dim = 3;
	Vector&lt;float&gt; a(dim,1), b;
	Vector&lt;double&gt; c(a);
	cerr &lt;&lt; &quot; main Check 1\n&quot;;
	b = a + c;
	cerr &lt;&lt; &quot; main Check 2\n&quot;;
	return 0;
}
</code></pre>
<p>Das Programm erzeugt dann folgende Ausgabe:</p>
<pre><code>Ctor 2 Check
 Standard Ctor Check
 Copy Ctor Check
 main Check 1
 op+ Check 1
 op+ Check 2
 op+= Check
 op+ Check 3
 op= Check
 Dtor Check
 main Check 2
 Dtor Check
 Dtor Check
 Dtor Check
</code></pre>
<p>Weis jemand Rat? Bin am verzweifeln <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/983957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/983957</guid><dc:creator><![CDATA[cris492]]></dc:creator><pubDate>Thu, 02 Feb 2006 13:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to Copyconstructor: obwohl ich eine definiere erzeugt der Compiler noch einen ??? on Thu, 02 Feb 2006 13:55:20 GMT]]></title><description><![CDATA[<p>Das hier:</p>
<p>template &lt;typename U&gt; Vector(const Vector&lt;U&gt; &amp;src);</p>
<p>Ist nicht <em>der</em> CopyConstructor, sondern irgendeiner. Du musst einen schreiben á la <em>Vector( const Vector&amp; src);</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/983963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/983963</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 02 Feb 2006 13:55:20 GMT</pubDate></item><item><title><![CDATA[Reply to Copyconstructor: obwohl ich eine definiere erzeugt der Compiler noch einen ??? on Thu, 02 Feb 2006 13:58:24 GMT]]></title><description><![CDATA[<p>mir geht ein Licht auf!<br />
Ich hab einen Konvertierungskonstruktor geschrieben und muss zusaetzlich eine CopyCtor schreiben.<br />
Ich versuche das.<br />
Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/983967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/983967</guid><dc:creator><![CDATA[cris492]]></dc:creator><pubDate>Thu, 02 Feb 2006 13:58:24 GMT</pubDate></item><item><title><![CDATA[Reply to Copyconstructor: obwohl ich eine definiere erzeugt der Compiler noch einen ??? on Thu, 02 Feb 2006 14:07:21 GMT]]></title><description><![CDATA[<p>Dieses Problem wäre vom Tisch. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
nochmals Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/983987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/983987</guid><dc:creator><![CDATA[cris492]]></dc:creator><pubDate>Thu, 02 Feb 2006 14:07:21 GMT</pubDate></item></channel></rss>