<?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[Klassendesign]]></title><description><![CDATA[<p>Abend jungs</p>
<p>Ich habe folgende Klassen:</p>
<pre><code class="language-cpp">#if! defined(windowobject_hpp_included)
#define windowobject_hpp_included

#include &lt;Windows.h&gt;
#include &lt;WindowsX.h&gt;
#include &lt;iostream&gt;

class WindowObject
{
protected:
	::HWND window_handle_;

public:
	// Standard Konstruktor
	WindowObject(void);

	// Verarbeitet Nachrichten dieses Fensters
	virtual ::LRESULT __stdcall window_procedure(::HWND handle, ::UINT message, ::WPARAM w_param, ::LPARAM l_param);
	// Verarbeitet Nachrichten aller Fenster
	::LRESULT static message_receiver(::HWND handle, ::UINT message, ::WPARAM w_param, ::LPARAM l_param);

	// setzt aktuelle Fenster Handle
	void	set_window_handle(::HWND handle);
	// ermittelt aktuelle Fenster Handle
	::HWND	get_window_handle(void) const; 

	static WindowObject* get_object_from_window(::HWND handle);

	// erzeugt Fenster
	virtual bool create(const std::basic_string&lt;wchar_t&gt;&amp; class_name, 
						const std::basic_string&lt;wchar_t&gt;&amp; caption, 
						long x, long y, long width, long height,
						long style, long style_ex,
						::HWND parent = 0) = 0;

	void show	(void);
	void hide	(void);
	void enable	(void);
	void disable(void);
};

#endif
</code></pre>
<pre><code class="language-cpp">#if! defined(control_hpp_included)
#define control_hpp_included

#include &quot;WindowObject.hpp&quot;

class Control : public WindowObject
{
protected:
	bool create(const std::basic_string&lt;wchar_t&gt;&amp; class_name, 
				const std::basic_string&lt;wchar_t&gt;&amp; caption, 
				long x, long y, long width, long height,
				long style, long style_ex,
				::HWND parent = 0);

public:
	Control(void);
};

#endif
</code></pre>
<pre><code class="language-cpp">#if! defined(button_hpp_included)
#define button_hpp_included

#include &quot;Control.hpp&quot;

class Button : public Control
{
public:
	virtual bool create(const std::basic_string&lt;wchar_t&gt;&amp; window_text, 
						long x, long y, long width, long height,
						long style, long style_ex,
						HWND parent = 0);
};

#endif
</code></pre>
<pre><code class="language-cpp">#include &quot;Control.hpp&quot;

//-----------------------------------------------------------------------//
// PUBLIC
//
// 
//-----------------------------------------------------------------------//
Control::Control(void) : WindowObject()
{

}

//-----------------------------------------------------------------------//
// PROTECTED
//
// 
//-----------------------------------------------------------------------//
bool Control::create(const std::basic_string&lt;wchar_t&gt;&amp; class_name, 
					 const std::basic_string&lt;wchar_t&gt;&amp; caption, 
					 long x, long y, long width, long height,
					 long style, long style_ex,
					 ::HWND parent)
{
	// Control erzeugen
	window_handle_ = ::CreateWindowEx(style_ex, 
									  class_name.c_str(),
									  caption.c_str(), 
									  style,
									  x, y, width, height, 
									  parent, 0,
									  ::GetModuleHandle(0), this);
	if(window_handle_)
		return(true);
	return(false);
}
</code></pre>
<pre><code class="language-cpp">#include &quot;Button.hpp&quot;

//-----------------------------------------------------------------------//
// PUBLIC
//
// 
//-----------------------------------------------------------------------//
bool Button::create(const std::basic_string&lt;wchar_t&gt;&amp; window_text, 
					long x, long y, long width, long height, 
					long style, long style_ex, 
					HWND parent)
{
	if(Control::create(L&quot;button&quot;, window_text, x, y, width, height, style, style_ex, parent))
		return(true);
	return(false);
}
</code></pre>
<p>Beim Aufruf von:</p>
<pre><code class="language-cpp">WindowObject* win = new Window();
	WindowObject* button = new Button();

	win-&gt;create(L&quot;buttonx&quot;, L&quot;test&quot;, 0, 0, 100, 200, WS_OVERLAPPEDWINDOW, WS_EX_APPWINDOW, 0);
	win-&gt;show();

	button-&gt;create(L&quot;hallo&quot;, 10, 10, 50, 20, 0, 0, win-&gt;get_window_handle());
</code></pre>
<p>kommt mir nun unlogischerweise folgender Fehler:</p>
<pre><code>error C2664: 'WindowObject::create': Konvertierung des Parameters 2 von 'int' in 'const std::basic_string&lt;_Elem,_Traits,_Ax&gt; &amp;' nicht möglich
1&gt;        with
1&gt;        [
1&gt;            _Elem=wchar_t,
1&gt;            _Traits=std::char_traits&lt;wchar_t&gt;,
1&gt;            _Ax=std::allocator&lt;wchar_t&gt;
1&gt;        ]
1&gt;        Ursache: Konvertierung von 'int' in 'const std::basic_string&lt;_Elem,_Traits,_Ax&gt;' nicht möglich
1&gt;        with
1&gt;        [
1&gt;            _Elem=wchar_t,
1&gt;            _Traits=std::char_traits&lt;wchar_t&gt;,
1&gt;            _Ax=std::allocator&lt;wchar_t&gt;
1&gt;        ]
1&gt;        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
</code></pre>
<p>Warum nimmt der hier die create-Funktion der Control Klasse?</p>
<pre><code class="language-cpp">button-&gt;create(L&quot;hallo&quot;, 10, 10, 50, 20, 0, 0, win-&gt;get_window_handle());
</code></pre>
<p>Wie kann ich das Problem umgehen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199667/klassendesign</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 19:18:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199667.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Dec 2007 20:32:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassendesign on Wed, 05 Dec 2007 20:32:37 GMT]]></title><description><![CDATA[<p>Abend jungs</p>
<p>Ich habe folgende Klassen:</p>
<pre><code class="language-cpp">#if! defined(windowobject_hpp_included)
#define windowobject_hpp_included

#include &lt;Windows.h&gt;
#include &lt;WindowsX.h&gt;
#include &lt;iostream&gt;

class WindowObject
{
protected:
	::HWND window_handle_;

public:
	// Standard Konstruktor
	WindowObject(void);

	// Verarbeitet Nachrichten dieses Fensters
	virtual ::LRESULT __stdcall window_procedure(::HWND handle, ::UINT message, ::WPARAM w_param, ::LPARAM l_param);
	// Verarbeitet Nachrichten aller Fenster
	::LRESULT static message_receiver(::HWND handle, ::UINT message, ::WPARAM w_param, ::LPARAM l_param);

	// setzt aktuelle Fenster Handle
	void	set_window_handle(::HWND handle);
	// ermittelt aktuelle Fenster Handle
	::HWND	get_window_handle(void) const; 

	static WindowObject* get_object_from_window(::HWND handle);

	// erzeugt Fenster
	virtual bool create(const std::basic_string&lt;wchar_t&gt;&amp; class_name, 
						const std::basic_string&lt;wchar_t&gt;&amp; caption, 
						long x, long y, long width, long height,
						long style, long style_ex,
						::HWND parent = 0) = 0;

	void show	(void);
	void hide	(void);
	void enable	(void);
	void disable(void);
};

#endif
</code></pre>
<pre><code class="language-cpp">#if! defined(control_hpp_included)
#define control_hpp_included

#include &quot;WindowObject.hpp&quot;

class Control : public WindowObject
{
protected:
	bool create(const std::basic_string&lt;wchar_t&gt;&amp; class_name, 
				const std::basic_string&lt;wchar_t&gt;&amp; caption, 
				long x, long y, long width, long height,
				long style, long style_ex,
				::HWND parent = 0);

public:
	Control(void);
};

#endif
</code></pre>
<pre><code class="language-cpp">#if! defined(button_hpp_included)
#define button_hpp_included

#include &quot;Control.hpp&quot;

class Button : public Control
{
public:
	virtual bool create(const std::basic_string&lt;wchar_t&gt;&amp; window_text, 
						long x, long y, long width, long height,
						long style, long style_ex,
						HWND parent = 0);
};

#endif
</code></pre>
<pre><code class="language-cpp">#include &quot;Control.hpp&quot;

//-----------------------------------------------------------------------//
// PUBLIC
//
// 
//-----------------------------------------------------------------------//
Control::Control(void) : WindowObject()
{

}

//-----------------------------------------------------------------------//
// PROTECTED
//
// 
//-----------------------------------------------------------------------//
bool Control::create(const std::basic_string&lt;wchar_t&gt;&amp; class_name, 
					 const std::basic_string&lt;wchar_t&gt;&amp; caption, 
					 long x, long y, long width, long height,
					 long style, long style_ex,
					 ::HWND parent)
{
	// Control erzeugen
	window_handle_ = ::CreateWindowEx(style_ex, 
									  class_name.c_str(),
									  caption.c_str(), 
									  style,
									  x, y, width, height, 
									  parent, 0,
									  ::GetModuleHandle(0), this);
	if(window_handle_)
		return(true);
	return(false);
}
</code></pre>
<pre><code class="language-cpp">#include &quot;Button.hpp&quot;

//-----------------------------------------------------------------------//
// PUBLIC
//
// 
//-----------------------------------------------------------------------//
bool Button::create(const std::basic_string&lt;wchar_t&gt;&amp; window_text, 
					long x, long y, long width, long height, 
					long style, long style_ex, 
					HWND parent)
{
	if(Control::create(L&quot;button&quot;, window_text, x, y, width, height, style, style_ex, parent))
		return(true);
	return(false);
}
</code></pre>
<p>Beim Aufruf von:</p>
<pre><code class="language-cpp">WindowObject* win = new Window();
	WindowObject* button = new Button();

	win-&gt;create(L&quot;buttonx&quot;, L&quot;test&quot;, 0, 0, 100, 200, WS_OVERLAPPEDWINDOW, WS_EX_APPWINDOW, 0);
	win-&gt;show();

	button-&gt;create(L&quot;hallo&quot;, 10, 10, 50, 20, 0, 0, win-&gt;get_window_handle());
</code></pre>
<p>kommt mir nun unlogischerweise folgender Fehler:</p>
<pre><code>error C2664: 'WindowObject::create': Konvertierung des Parameters 2 von 'int' in 'const std::basic_string&lt;_Elem,_Traits,_Ax&gt; &amp;' nicht möglich
1&gt;        with
1&gt;        [
1&gt;            _Elem=wchar_t,
1&gt;            _Traits=std::char_traits&lt;wchar_t&gt;,
1&gt;            _Ax=std::allocator&lt;wchar_t&gt;
1&gt;        ]
1&gt;        Ursache: Konvertierung von 'int' in 'const std::basic_string&lt;_Elem,_Traits,_Ax&gt;' nicht möglich
1&gt;        with
1&gt;        [
1&gt;            _Elem=wchar_t,
1&gt;            _Traits=std::char_traits&lt;wchar_t&gt;,
1&gt;            _Ax=std::allocator&lt;wchar_t&gt;
1&gt;        ]
1&gt;        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
</code></pre>
<p>Warum nimmt der hier die create-Funktion der Control Klasse?</p>
<pre><code class="language-cpp">button-&gt;create(L&quot;hallo&quot;, 10, 10, 50, 20, 0, 0, win-&gt;get_window_handle());
</code></pre>
<p>Wie kann ich das Problem umgehen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415501</guid><dc:creator><![CDATA[igash]]></dc:creator><pubDate>Wed, 05 Dec 2007 20:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to Klassendesign on Wed, 05 Dec 2007 20:36:21 GMT]]></title><description><![CDATA[<p>Achso, ich möchte das Problem so umgehen, dass ich weiterhin die Bezeichnung create nutzen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415504</guid><dc:creator><![CDATA[igash]]></dc:creator><pubDate>Wed, 05 Dec 2007 20:36:21 GMT</pubDate></item><item><title><![CDATA[Reply to Klassendesign on Thu, 06 Dec 2007 00:36:15 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>dein Button::Create ist eine neue virtuelle Funktion, da sie verschiedene Parameter hat, als die der Klasse drüber. Deswegen werden diese nicht überschrieben.</p>
<p>Dein Compiler sieht die Variable button als WinO* und versucht dann über die vtable die passende überschriebene Funktion in Button zu finden. Doch gibt es dort so eine Funktion nicht und er muss auf die in WinO ausweichen.</p>
<p>Dir bleibt nichts anderes übrig, um das polymorphe Verhalten beizubehalten, create in Button auch mit der selben Signatur zu definieren.</p>
<p>Was besser weiß ich nicht <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>Edit: Oder boost::variant als zweiten Parameter verwenden oder was selbst dafür basteln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415570</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2007 00:36:15 GMT</pubDate></item><item><title><![CDATA[Reply to Klassendesign on Thu, 06 Dec 2007 10:22:36 GMT]]></title><description><![CDATA[<p>Der Compiler sieht beim Compilieren nur den statischen Typ von button, und der ist vom Typ <code>WindowObject</code> . Deshalb kann der Compiler dafuer auch nur die Funktionen akzeptieren, die WindowObject bereitstellt. Um das zu umgehen, kannst du einen dynamic_cast&lt;&gt; auf Button* versuchen, was allerdings in dem Fall kein schoener Stil waere, oder die Polymorphie richtig nutzen, indem du die virtuellen Funktionen in den abgeleiteten Klassen mit gleicher Signatur ueberlaedst.</p>
<p>Abgesehen davon kommt mir das Design von WindowObject etwas kaputt vor: du erstellst mit dem Standardkonstruktor ein WindowObject ohne wirkliche Eigenschaften und versuchst die dann mit create() zu setzen. Das klingt son bisschen nach absichtlicher Totgeburt mit folgender Reanimation. Die Sache ist doch allgemein die:<br />
Wenn ein Objekt nicht richtig erstellt werden kann, kann man es auch nicht nutzen. In deinem Fall bedeutet das vermutlich, dass create() dir ein false zurueckgibt (reanimation fehlgeschlagen) und du lebst mit einem Untoten WindowObject weiter, dem nur noch ein delete() hilft. Gerade wenn eine Klasse mehrere Member hat, weiss man dann oft nicht mehr genau, welche davon konstruiert wurden und wieder zerstoert wrden muessen, und bei welchen create() gescheitert ist. Einfacher ist folgendes: Verlege die Funktionalitaet von create() in den Konstruktor. Wenn das Erzeugen des Objekts fehlschlaegt, loese eine Exception aus. Dann wird zuerst alels was bis dahin schon erzeugt wurde an Membern wieder zerstoert, und wenn die Ueberbleibsel der vergeblichen Objektkonstruktion abgeraeumt sind, wird die Exception an die Funktion weitergereicht, die versucht hat, das WindowObject zu erstellen. Du bist dann genauso ungluecklich wie vorher (hast naemlich kein Fenster erstellen koennen udn musst irgendwie damit umgehn, z.B. indem du die Exception durchfliegen laesst und das Programm abbrichst), musst dich aber nicht mehr mit dem halbfertigen Fensterzombie rumschlagen.<br />
Fuer den Fall, dass Teile des Objektes optionale Komponenten sind, erzeuge die mittels Pointern. Wenn die Konstruktion der Komponente fehlschlaegt setz den Pointer auf 0 und gut ists.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415714</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 06 Dec 2007 10:22:36 GMT</pubDate></item></channel></rss>