<?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[Protected hilft mir nicht!]]></title><description><![CDATA[<p>Hi! Ich habe ein Problem mit Klassenableiten. Ich baue mir den Singletonpattern, wobei eine Basisklasse folgenderweise definiert wird:</p>
<pre><code class="language-cpp">namespace Interface {

	class basic {

	protected:

		// static data (appr. 8 bytes) - these are the only 'global' variables:
		static basic* bw_;
		static int exit_code_;
/*...*/
		// protected constructors and destructor:
		basic(/*...*/);
		basic(const basic&amp;);
		basic&amp; operator=(const basic&amp;);

		// virtual destructor ensures polymorhism and avoids memory leaks:
		virtual ~basic();

	public:

		//static methods:
		static basic* obj() {
			return bw_;
		}

		static void free() {
			delete bw_;
			bw_ = 0;
			exit_code_ = 0;
		}
</code></pre>
<p>Die neue Klasse sieht so aus:</p>
<pre><code class="language-cpp">namespace Interface {

	class advanced: public basic {
	public:
		static bool create(/*...*/) {
			if(bw_)
				free();
			bw_ = new basic(/*...*/);
			if(!bw_)
				exit_code_ = -1;
			return bw_ != 0;
		}
	};
}
</code></pre>
<p>Leider klappt das nicht. Ich kriege die Meldung, dass ich protected Methode nicht ausführen darf!</p>
<blockquote>
<p>Error 1 error C2248: 'Interface::basic::basic' : cannot access protected member declared in class 'Interface::basic' c:\documents and settings\zdravko\my documents\visual studio 2005\projects\interface\interface\advanced.hpp 15</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/topic/182638/protected-hilft-mir-nicht</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 00:43:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182638.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 May 2007 15:33:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Protected hilft mir nicht! on Sun, 27 May 2007 15:36:07 GMT]]></title><description><![CDATA[<p>Hi! Ich habe ein Problem mit Klassenableiten. Ich baue mir den Singletonpattern, wobei eine Basisklasse folgenderweise definiert wird:</p>
<pre><code class="language-cpp">namespace Interface {

	class basic {

	protected:

		// static data (appr. 8 bytes) - these are the only 'global' variables:
		static basic* bw_;
		static int exit_code_;
/*...*/
		// protected constructors and destructor:
		basic(/*...*/);
		basic(const basic&amp;);
		basic&amp; operator=(const basic&amp;);

		// virtual destructor ensures polymorhism and avoids memory leaks:
		virtual ~basic();

	public:

		//static methods:
		static basic* obj() {
			return bw_;
		}

		static void free() {
			delete bw_;
			bw_ = 0;
			exit_code_ = 0;
		}
</code></pre>
<p>Die neue Klasse sieht so aus:</p>
<pre><code class="language-cpp">namespace Interface {

	class advanced: public basic {
	public:
		static bool create(/*...*/) {
			if(bw_)
				free();
			bw_ = new basic(/*...*/);
			if(!bw_)
				exit_code_ = -1;
			return bw_ != 0;
		}
	};
}
</code></pre>
<p>Leider klappt das nicht. Ich kriege die Meldung, dass ich protected Methode nicht ausführen darf!</p>
<blockquote>
<p>Error 1 error C2248: 'Interface::basic::basic' : cannot access protected member declared in class 'Interface::basic' c:\documents and settings\zdravko\my documents\visual studio 2005\projects\interface\interface\advanced.hpp 15</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1293160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293160</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sun, 27 May 2007 15:36:07 GMT</pubDate></item><item><title><![CDATA[Reply to Protected hilft mir nicht! on Sun, 27 May 2007 16:59:58 GMT]]></title><description><![CDATA[<p>Beim Zugriff auf protected nicht-statische Funktionen oder Daten muss der Zugriff stets über eine Referenz oder einen Zeiger auf die abgeleitete Klasse erfolgen. Der Zugriff soll erlaubt sein, <em>weil</em> die entsprechende Klasse eine Basisklasse ist. Den Sinn dieser zusätzlichen Regel kann man sich an einem einfachen Beispiel klar machen:</p>
<pre><code class="language-cpp">class A
{
protected:
    int foo;
};

class B : public A
{
};

class C : public A
{
public:
    void bar(A&amp; a, B&amp; b)
    {
        /* this-&gt; */ foo = 0;   // ok
        b.foo = 0;              // fehler! C hat nichts mit den Daten eines B-Objektes zu schaffen
        a.foo = 0;              // fehler! muss ja kein C-Objekt dahinterstehen

// brutal und böse:
        b.*(&amp;A::foo) = 0;       // hier versagt die Zugriffskontrolle
    }
};
</code></pre>
<p>Für protected Konstruktoren der Basisklasse bedeutet das nun, dass diese nur über die Initialisierungsliste der Konstruktoren der abgeleiteten Klasse verwendet werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293220</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 27 May 2007 16:59:58 GMT</pubDate></item></channel></rss>