<?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[&amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem.<br />
Ich habe bisher in einem sehr einfachen MFC-Programm im OnOK() ein SetWindowPos benutzt:</p>
<p>CAViewDlg::SetWindowPos(&amp;CWnd::wndTopMost,300,0,600,20,0);</p>
<p>Um es für später(wenn ich mal ein richtiges Programm habe) übersichtlicher zu haben, will ich möglichst alles in eine App.h und App.cpp auslagern.</p>
<p>Also, mach in ne App.h:</p>
<p>//--------------------------------------------------------------------<br />
#include &quot;blablabla&quot; //Alle .h eingebunden die ich im Projekt habe</p>
<p>class CInit<br />
{<br />
CInit();<br />
DoInit();<br />
};<br />
//--------------------------------------------------------------------</p>
<p>in die App.cpp schreib ich:</p>
<p>//------------------------------------------------------------------<br />
#include &quot;blablabla&quot; //Alle .h eingebunden die ich im Projekt habe</p>
<p>CInit::CInit() {}<br />
CInit::DoInit()<br />
{<br />
CAViewDlg::SetWindowPos(&amp;CWnd::wndTopMost,300,0,600,20,0);<br />
}<br />
//------------------------------------------------------------------</p>
<p>und dann mach ich im OnOk():<br />
CInit INIT;<br />
INIT::DoInit;</p>
<p>Das komische ist, dass es tut, wenn ich das SetWindowPos direkt im OnOK() mache, aber wenn ich es in meine Init-Klasse auslagere kommt:</p>
<p>error C2352: 'CWnd::SetWindowPos' : illegal call of non-static member function</p>
<p>Es kommt auch ohne den Aufruf in OnOk(). Also wird wohl an der Implementierung liegen. Aber wo ist das Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179846/quot-illegal-call-of-non-static-member-function-quot-bei-setwindowpos-in-eigener-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 11:52:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179846.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Apr 2007 18:28:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Wed, 25 Apr 2007 18:28:07 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem.<br />
Ich habe bisher in einem sehr einfachen MFC-Programm im OnOK() ein SetWindowPos benutzt:</p>
<p>CAViewDlg::SetWindowPos(&amp;CWnd::wndTopMost,300,0,600,20,0);</p>
<p>Um es für später(wenn ich mal ein richtiges Programm habe) übersichtlicher zu haben, will ich möglichst alles in eine App.h und App.cpp auslagern.</p>
<p>Also, mach in ne App.h:</p>
<p>//--------------------------------------------------------------------<br />
#include &quot;blablabla&quot; //Alle .h eingebunden die ich im Projekt habe</p>
<p>class CInit<br />
{<br />
CInit();<br />
DoInit();<br />
};<br />
//--------------------------------------------------------------------</p>
<p>in die App.cpp schreib ich:</p>
<p>//------------------------------------------------------------------<br />
#include &quot;blablabla&quot; //Alle .h eingebunden die ich im Projekt habe</p>
<p>CInit::CInit() {}<br />
CInit::DoInit()<br />
{<br />
CAViewDlg::SetWindowPos(&amp;CWnd::wndTopMost,300,0,600,20,0);<br />
}<br />
//------------------------------------------------------------------</p>
<p>und dann mach ich im OnOk():<br />
CInit INIT;<br />
INIT::DoInit;</p>
<p>Das komische ist, dass es tut, wenn ich das SetWindowPos direkt im OnOK() mache, aber wenn ich es in meine Init-Klasse auslagere kommt:</p>
<p>error C2352: 'CWnd::SetWindowPos' : illegal call of non-static member function</p>
<p>Es kommt auch ohne den Aufruf in OnOk(). Also wird wohl an der Implementierung liegen. Aber wo ist das Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273493</guid><dc:creator><![CDATA[slide]]></dc:creator><pubDate>Wed, 25 Apr 2007 18:28:07 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Wed, 25 Apr 2007 18:49:08 GMT]]></title><description><![CDATA[<p>also erstens sind deine Methoden private, also hast gar keinen Zugriff, zweitens muss das INIT**.**DoInit() sein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273505</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Wed, 25 Apr 2007 18:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Wed, 25 Apr 2007 19:00:38 GMT]]></title><description><![CDATA[<p>slide schrieb:</p>
<blockquote>
<p>Aber wo ist das Problem?</p>
</blockquote>
<p>Das Problem ist, dass du zum Aufruf von SetWindowPos ein konkretes CAViewDlg-Objekt brauchst. Das hast du implizit aber nur innerhalb von nichtstatischen Methoden von CAViewDlg, wie z.B. OnOK. Da kannst dir das CAViewDlg:: übrigens auch sparen.</p>
<p>Kann es sein, dass dir der Unterschied zwischen Klasse und Instanz noch nicht ganz klar ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273517</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 25 Apr 2007 19:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Wed, 25 Apr 2007 19:06:26 GMT]]></title><description><![CDATA[<p>Tut mir leid, ich habe das alles abgekürzt, damit man nich soviel zum lesen hat, da hab ich glatt das public: weggemacht.</p>
<p>Zu dem INIT.DoInit() : Kann sein, aber die Meldung kommt ja schon ohne Aufruf von DoInit.</p>
<p>Es kommt sobald ich die CInit klasse hinzugefügt habe und dass</p>
<p>CAViewDlg::SetWindowPos(&amp;CWnd::wndTopMost,300,0,600,500,0);</p>
<p>hineingeschrieben habe.</p>
<p>Er blickt das CAViewDlg::SetWindow nicht, aber wiso tut es dann, wenn ichs im OnOk() mache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273522</guid><dc:creator><![CDATA[slide]]></dc:creator><pubDate>Wed, 25 Apr 2007 19:06:26 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Wed, 25 Apr 2007 19:17:42 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Kann es sein, dass dir der Unterschied zwischen Klasse und Instanz noch nicht ganz klar ist?</p>
</blockquote>
<p>Doch, der ist mir klar. Ich habs auch schon mit der Instanz versucht, die in der AView.cpp erstellt wird ( CAViewDlg dlg; )</p>
<p>Aber wenn ich dlg::SetWindowPos versuche kennt er dlg nicht.<br />
Was kann ich machen, damit ich ein SetWindowPos des Fensters machen kann?</p>
<p>Muss ich da mit FindWindow nen Handle holen und davon dann nen CWnd holen oder einen globalen Pointer definieren den ich dann auf dlg zeigen lasse?</p>
<p>Bitte sag mir wie da die beste Lösung ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273528</guid><dc:creator><![CDATA[slide]]></dc:creator><pubDate>Wed, 25 Apr 2007 19:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Wed, 25 Apr 2007 23:09:49 GMT]]></title><description><![CDATA[<p>Hallo, inzwischen funktioniert es recht gut, aber immer noch nicht so wie ich denke, dass es sein sollte.</p>
<p>Damit ihr es alle Nachvollziehen könnt, beschreibe ich es mal Schritt für Schritt:<br />
Ich öffne VC++ 6.0 und wähle MFC-Application Wizard aus, meinem Projekt gebe ich den Namen &quot;TRY&quot;.<br />
Nun wähle ich Dialogbasierend, mit 3D-Controlls und Sockets, MFC Standard, mit Kommentare, statisch gelinkte Library.</p>
<p>Nun habe ich ein frisches Projekt an dem ich noch nichts kaputt gemacht habe <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>Wenn ich nun in die TRY.cpp schaue, sehe ich:<br />
-defs und includes<br />
-Messagemap<br />
-CTRYApp Konstruktor<br />
-und hier nun:<br />
// The one and only CTRYApp object<br />
CTRYApp theApp;</p>
<p>Nach allem was ich von C++ verstehe, auch wenn es anscheinend nicht viel zu sein scheint, wird hier ein Objekt(eine Instanz der Klasse CTRYApp generiert.<br />
Somit müsste ich Unmittelbar nach der Erstellung(1 zeile darunter)<br />
&quot;theApp.&quot; eingeben können um die Syntax-Hilfe zu sehen, oder zumindest etwas wie<br />
&quot;theApp.AssertValid;&quot; machen können.</p>
<p>Doch es wird mir keine Syntaxhilfe angezeigt und bei &quot;theApp.AssertValid;&quot; wird angezeigt, dass er ein ; statt des . erwartet.<br />
Als wenn er es nicht als Objekt erkennen würde.<br />
Das komische ist, dass im Konstruktor z.b. bei &quot;theApp.&quot; sofort die syntaxhilfe angezeigt wird.<br />
Und ebenfalls wenn ich &quot;= theApp.&quot; eingebe.<br />
Ich versteh dass nicht. Wiso kann ich nicht direkt nach der Erstellung das Objekt genau so nutzen wie im Konstruktor auch? Oder wie auch in andere &quot;Klassenfremden&quot; Funktionen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273616</guid><dc:creator><![CDATA[slide]]></dc:creator><pubDate>Wed, 25 Apr 2007 23:09:49 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Wed, 25 Apr 2007 23:44:25 GMT]]></title><description><![CDATA[<p>IntelliSense (die &quot;Syntax-Hilfe&quot;) funktioniert in VC6 nur sehr schlecht, also vergiss einfach dass der dir irgendwas irgendwo nicht anzeigt, wenn du genug &quot;komplizierten&quot; Code schreibst zeigt der nämlich gleich garnixmehr an.</p>
<p>Dass &quot;theApp.AssertValid;&quot; nicht geht liegt einfach daran dass es falsch ist, was du willst ist &quot;theApp.AssertValid();&quot;.<br />
(&quot;&amp;theApp.AssertValid;&quot; wäre ein &quot;legales nop&quot;, macht aber keinen Sinn)</p>
<p>Und direkt nach &quot;CTRYApp theApp;&quot; kannst du theApp einfach deswegen nicht verwenden, weil du da auf &quot;(global) namespace scope&quot; bist, und auf &quot;namespace scope&quot; kannst du keine Funktionen &quot;direkt&quot; aufrufen.<br />
Indirekt ja, das sähe dann z.B. so aus:</p>
<pre><code class="language-cpp">int globale_dummy_variable = (globales_objekt.funktion(), 0);
</code></pre>
<p>Würde ich aber nicht empfehlen solange du nicht weisst was du tust.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273620</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 25 Apr 2007 23:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Thu, 26 Apr 2007 10:15:42 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>IntelliSense (die &quot;Syntax-Hilfe&quot;) funktioniert in VC6 nur sehr schlecht, also vergiss einfach dass der dir irgendwas irgendwo nicht anzeigt, wenn du genug &quot;komplizierten&quot; Code schreibst zeigt der nämlich gleich garnixmehr an.</p>
<p>Dass &quot;theApp.AssertValid;&quot; nicht geht liegt einfach daran dass es falsch ist, was du willst ist &quot;theApp.AssertValid();&quot;.<br />
(&quot;&amp;theApp.AssertValid;&quot; wäre ein &quot;legales nop&quot;, macht aber keinen Sinn)</p>
<p>Und direkt nach &quot;CTRYApp theApp;&quot; kannst du theApp einfach deswegen nicht verwenden, weil du da auf &quot;(global) namespace scope&quot; bist, und auf &quot;namespace scope&quot; kannst du keine Funktionen &quot;direkt&quot; aufrufen.<br />
Indirekt ja, das sähe dann z.B. so aus:</p>
<pre><code class="language-cpp">int globale_dummy_variable = (globales_objekt.funktion(), 0);
</code></pre>
<p>Würde ich aber nicht empfehlen solange du nicht weisst was du tust.</p>
</blockquote>
<p>Das theApp.AssertValid war nur ein Bsp. da es das erste war dass ich gefunden hab das keine Parameter braucht.<br />
Direkt dahinter wollte ich es benutzen um z.b. sowas zu machen:</p>
<p>CTRYApp theApp;<br />
CInit INIT;<br />
INIT.pointertoApp = &amp;theApp;<br />
(auch wenn ich inzwischen glaub, dass ich diesen Pointer garnich mehr brauch)</p>
<p>Das mit den namespaces blick ich noch nich so ganz, da muss ich wohl erstmal noch was drüber lesen.</p>
<p>Auf jedenfall:<br />
Ich will in meinem Programm zur Übersichtlichkeit mehrere Objekte haben von denen jede nur für seine Aufgabe zuständig ist.<br />
- &quot;CDataFrame DFRAME&quot; für Daten die ich überall im Programm brauche(praktisch globale vars)<br />
- &quot;CInitFrame INIT&quot; für Initialisierung (Winow-Positionierung, eigenschaften festlegen)<br />
- &quot;CGrafx GRAF&quot; für alle Grafiksachen (zeichnen, bmps einladen, usw..)</p>
<p>Über die einzelnen Member der Klassen bin ich mir noch nicht sicher.</p>
<p>Auf jedenfall will ich später z.B. per Timer oder auch buttonclick so arbeiten können:<br />
INIT.SetWnd(DFRAME.WndSizeX, DFRAME.WndSizeY);<br />
GRAF.makeline(DFRAME.WndSizeX, DFRAME.WndSizeY, DFRAME.Color);</p>
<p>Wenn ich in meinem Init z.B. ein FindWindow machen will, muss ich dann den Pointer auf den Dialog übergeben, oder kann ich auch etwas in dieser Art machen:<br />
( theApp.GetDialog() )-&gt;FindWindow();<br />
Ist theApp dann von Init aus aufrufbar? Oder ist das vieleicht ein anderer namespace?</p>
<p>Wie läuft das eigentlich bei etwas professionelleren MFC-Programmen ab?<br />
Wird dort nicht für jede Aufgabe eine Klasse &quot;erschaffen&quot;? Oder wird da alles in Funktionen der Dialog oder APP -Klasse gepackte?<br />
Gibt es Dokumente oder Festlegungen wie man es machen &quot;sollte&quot; ? Oder einfach auch nur Tipps, mit denen ihr gute Erfahrungen gemacht habt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273812</guid><dc:creator><![CDATA[slide]]></dc:creator><pubDate>Thu, 26 Apr 2007 10:15:42 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Thu, 26 Apr 2007 16:02:52 GMT]]></title><description><![CDATA[<p>Hmm, ich denk zwar dass ichs inzwischen halbwegs verstehe, aber es tut noch nicht.</p>
<p>Ich habe nun in der App.h:</p>
<pre><code class="language-cpp">//Keine Includes

class CInit()
public:
  CInit();
  DoInit();
};
</code></pre>
<p>In der App.cpp:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &quot;AView.h&quot;
#include &quot;AViewDlg.h&quot;
#include &quot;App.h&quot;

CInit::CInit()
{}
CInit::DoInit()
{
  theApp.m_pMainWnd-&gt;SetWindowPos(&amp;CWnd::wndTopMost,300,0,600,20,0);
  DFRAME.Wnd_SIZE = 0;
}
</code></pre>
<p>In der AView.cpp habe ich direkt unter der Instanzerstellung der Window-Klasse theApp eine Instanz meiner Klasse erstellt: CInit INIT;<br />
Nun dachte ich, dass ich aus meiner DoInit heraus auf theApp zugreifen kann, aber dies scheint nicht der Fall zu sein, denn ich bekomme folgenden Fehler:</p>
<p>error C2065: 'theApp' : undeclared identifier</p>
<p>Wiso kennt der Compiler &quot;theApp&quot; an dieser Stelle nicht? Wiso wird es mir vom IntelliSense trotzdem angezeigt?<br />
Ein namespace-Problem? Oder ein Fehler mit den Includes?<br />
Muss man ihm vieleicht irgendwie sagen, dass er AView.cpp vor App.cpp kompilieren muss, damit er die Instanzen kennt?</p>
<p>Vielend Dank schonmal an alle die Antworten und schon geantwortet haben.<br />
Ich merke richtig wie sich mein Kopf mit Wissen füllt <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="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1274084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1274084</guid><dc:creator><![CDATA[slide]]></dc:creator><pubDate>Thu, 26 Apr 2007 16:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Thu, 26 Apr 2007 16:14:23 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &quot;MainFrm.h&quot;

CInit::DoInit()
{
   AfxGetMainWnd()-&gt;SetWindowPos(&amp;CWnd::wndTopMost,300,0,600,20,0);
   DFRAME.Wnd_SIZE = 0;
}
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1274091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1274091</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 26 Apr 2007 16:14:23 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;illegal call of non-static member function&amp;quot; bei SetWindowPos in eigener Klasse on Thu, 26 Apr 2007 16:33:41 GMT]]></title><description><![CDATA[<p>Danke, für diesen Fall funktioniert das.<br />
Aber jetzt habe ich eine 2.Klasse erstellt. Wie ich schon weiter oben mal erwähnt habe, um variablen zu speichern, die ich an vielen stellen brauche.<br />
Ich nenne sie DFRAME.<br />
App.h</p>
<pre><code class="language-cpp">class CDFrame
{
public:
	CDFrame();

	CAViewDlg* ptoDLG;
	CAViewApp* ptoAPP;

	int Wnd_SIZE;
};
</code></pre>
<p>App.cpp</p>
<pre><code class="language-cpp">CDFrame::CDFrame()
{
	ptoDLG = NULL;
	ptoAPP = NULL;

	Wnd_SIZE = 0;
}
</code></pre>
<p>Aber ich kann aus der DoInit() Funktion nicht DFRAME.Wnd_SIZE = 0; ausführen, da sonst wieder kommt:<br />
error C2065: 'DFRAME' : undeclared identifier</p>
<p>Ich dachte, wenn ich ich die Instanzen in der AView.cpp erstelle sind sie global nutzbar. Wiso sind sie dass nicht? Kann man das irgendwie hinbekommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1274103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1274103</guid><dc:creator><![CDATA[slide]]></dc:creator><pubDate>Thu, 26 Apr 2007 16:33:41 GMT</pubDate></item></channel></rss>