<?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[Fehler beim Zugrif auf geerbte statische Funtion]]></title><description><![CDATA[<p>Folgende Fehlermeldung bringt mich nicht weiter:</p>
<pre><code>./util/ASingleton.hpp:24: error: ‘static T* util::ASingleton&lt;T&gt;::GetSingleton() [with T = net::CServer]’ is inaccessible
main.cpp:22: error: within this context
</code></pre>
<p>Was mache ich falsch?</p>
<p>ASingleton.hpp</p>
<pre><code class="language-cpp">/*------------------------------------Makros und Includes---------------------------------------*/
#ifndef SINGLETON_H
#define SINGLETON_H

/*----------------------------------------------------------------------------------------------*/

namespace util
{

    /** 
      * \brief Der Singleton stellt sicher, dass eine Klasse nur ein mal existiert.
      *
      * ASingleton ist eine Abstrakte Basisklasse, von der sämmtliche Unterklassen erben, die nur einmal
      * existieren Dürfen.
      */
    template &lt;typename T&gt;
    class ASingleton
    {
    public:
        ///rein virtueller Destruktor verhindert Instantiirung. Die Klasse ist nur zum Ableiten gedacht
        virtual ~ASingleton()=0;

        ///Diese Funktion gibt einen Pointer auf das Singleton zurück
        static T* GetSingleton()
        {
            if(m_Singleton == NULL)
            {
                m_Singleton = new T;
            }

            return m_Singleton;
        }

    protected:
        /// Instanz-Pointer
        static T* m_Singleton;
    };

    template &lt;typename T&gt; ASingleton&lt;T&gt;::~ASingleton()
    {

    }

    template &lt;typename T&gt; T* ASingleton &lt;T&gt;::m_Singleton = NULL;

}

#endif
</code></pre>
<p>CServer.hpp</p>
<pre><code class="language-cpp">/*------------------------------------Makros und Includes---------------------------------------*/
#ifndef CSERVER_HPP_INCLUDED
#define CSERVER_HPP_INCLUDED

//Library-Includes

//Projekt-Includes
#include &quot;util/ASingleton.hpp&quot;

/*----------------------------------------------------------------------------------------------*/

namespace net
{
    /** \brief Die Klasse CServer ist das Zentrale Modul des Serverseitigen Netzwerks
      * 
      */
    class CServer
            : public ANetwork,
                     util::ASingleton&lt;CServer&gt;
    {
        // [...]
    };
}

#endif // CSERVER_HPP_INCLUDED
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;net/server/CServer.hpp&quot;

int main()
{
    net::CServer * server = net::CServer::GetSingleton();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/199982/fehler-beim-zugrif-auf-geerbte-statische-funtion</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 23:52:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199982.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Dec 2007 12:51:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehler beim Zugrif auf geerbte statische Funtion on Sun, 09 Dec 2007 12:52:12 GMT]]></title><description><![CDATA[<p>Folgende Fehlermeldung bringt mich nicht weiter:</p>
<pre><code>./util/ASingleton.hpp:24: error: ‘static T* util::ASingleton&lt;T&gt;::GetSingleton() [with T = net::CServer]’ is inaccessible
main.cpp:22: error: within this context
</code></pre>
<p>Was mache ich falsch?</p>
<p>ASingleton.hpp</p>
<pre><code class="language-cpp">/*------------------------------------Makros und Includes---------------------------------------*/
#ifndef SINGLETON_H
#define SINGLETON_H

/*----------------------------------------------------------------------------------------------*/

namespace util
{

    /** 
      * \brief Der Singleton stellt sicher, dass eine Klasse nur ein mal existiert.
      *
      * ASingleton ist eine Abstrakte Basisklasse, von der sämmtliche Unterklassen erben, die nur einmal
      * existieren Dürfen.
      */
    template &lt;typename T&gt;
    class ASingleton
    {
    public:
        ///rein virtueller Destruktor verhindert Instantiirung. Die Klasse ist nur zum Ableiten gedacht
        virtual ~ASingleton()=0;

        ///Diese Funktion gibt einen Pointer auf das Singleton zurück
        static T* GetSingleton()
        {
            if(m_Singleton == NULL)
            {
                m_Singleton = new T;
            }

            return m_Singleton;
        }

    protected:
        /// Instanz-Pointer
        static T* m_Singleton;
    };

    template &lt;typename T&gt; ASingleton&lt;T&gt;::~ASingleton()
    {

    }

    template &lt;typename T&gt; T* ASingleton &lt;T&gt;::m_Singleton = NULL;

}

#endif
</code></pre>
<p>CServer.hpp</p>
<pre><code class="language-cpp">/*------------------------------------Makros und Includes---------------------------------------*/
#ifndef CSERVER_HPP_INCLUDED
#define CSERVER_HPP_INCLUDED

//Library-Includes

//Projekt-Includes
#include &quot;util/ASingleton.hpp&quot;

/*----------------------------------------------------------------------------------------------*/

namespace net
{
    /** \brief Die Klasse CServer ist das Zentrale Modul des Serverseitigen Netzwerks
      * 
      */
    class CServer
            : public ANetwork,
                     util::ASingleton&lt;CServer&gt;
    {
        // [...]
    };
}

#endif // CSERVER_HPP_INCLUDED
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;net/server/CServer.hpp&quot;

int main()
{
    net::CServer * server = net::CServer::GetSingleton();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1417527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417527</guid><dc:creator><![CDATA[darthdespotism]]></dc:creator><pubDate>Sun, 09 Dec 2007 12:52:12 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim Zugrif auf geerbte statische Funtion on Sun, 09 Dec 2007 13:06:39 GMT]]></title><description><![CDATA[<p>Hmm wie ist der Konstruktor von CServer definiert? Also welchen Access-Bereich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417538</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sun, 09 Dec 2007 13:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim Zugrif auf geerbte statische Funtion on Sun, 09 Dec 2007 13:13:04 GMT]]></title><description><![CDATA[<p>CServer.cpp</p>
<pre><code class="language-cpp">CServer::CServer()
        : log_(&quot;CServer&quot;, log::CLog::NOTICE)
    {
        peer_ = RakNetworkFactory::GetRakPeerInterface();
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1417542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417542</guid><dc:creator><![CDATA[darthdespotism]]></dc:creator><pubDate>Sun, 09 Dec 2007 13:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim Zugrif auf geerbte statische Funtion on Sun, 09 Dec 2007 13:31:26 GMT]]></title><description><![CDATA[<p>Davon abgesehen, dass peer_ wahrscheinlich auch in die Initialisierungsliste kann, wollte ich nur wissen ob es public, private oder protected ist ...<br />
wobei das ist eigtl. unwichtig ... seh ich gerade erst.</p>
<pre><code class="language-cpp">#ifndef SINGLETON_H
#define SINGLETON_H

/*----------------------------------------------------------------------------------------------*/

namespace util
{

    /**
      * \brief Der Singleton stellt sicher, dass eine Klasse nur ein mal existiert.
      *
      * ASingleton ist eine Abstrakte Basisklasse, von der sämmtliche Unterklassen erben, die nur einmal
      * existieren Dürfen.
      */
    template &lt;typename T&gt;
    class ASingleton
    {
    public:
        ///rein virtueller Destruktor verhindert Instantiirung. Die Klasse ist nur zum Ableiten gedacht
        virtual ~ASingleton()=0;

        ///Diese Funktion gibt einen Pointer auf das Singleton zurück
        static T* GetSingleton()
        {
            if(m_Singleton == NULL)
            {
                m_Singleton = new T;
            }

            return m_Singleton;
        }

    protected:
        /// Instanz-Pointer
        static T* m_Singleton;
    };

    template &lt;typename T&gt; ASingleton&lt;T&gt;::~ASingleton()
    {

    }

    template &lt;typename T&gt; T* ASingleton &lt;T&gt;::m_Singleton = NULL;

}

#endif
</code></pre>
<p>hmm 1. guck dir das Pattern mal noch einmal an. Was du da machst, ist murks. Du gibst am Ende übrigens keinen Speicher wieder frei!</p>
<pre><code class="language-cpp">#if !defined (SINGLETON_H__INCLUDED)
#define SINGLETON_H__INCLUDED

#if (_MSC_VER &gt;= 1300)
#pragma once
#endif // (_MSC_VER &gt;= 1300)

template &lt;class type&gt;
class singleton
{
    singleton(singleton const&amp;);
    singleton&amp; operator=(singleton const&amp;);

public:
    static type&amp; instance() { static type _inst; return _inst; }
};

#endif // SINGLETON_H__INCLUDED
</code></pre>
<p>aber denk mal an die Probleme, die durch singletons auftreten können ...</p>
<p>eines davon sind wir durch folgendes los:</p>
<pre><code class="language-cpp">#if !defined (SINGLETON_H__INCLUDED)
#define SINGLETON_H__INCLUDED

#if (_MSC_VER &gt;= 1300)
#pragma once
#endif // (_MSC_VER &gt;= 1300)

#include &lt;memory&gt;

template &lt;class type&gt;
class singleton
{
    singleton(singleton const&amp;);
    singleton&amp; operator=(singleton const&amp;);

public:
    static const type* instance() { static std::auto_ptr&lt;type&gt;(new type) _inst; return _inst; }
};

#endif // SINGLETON_H__INCLUDED
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1417551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417551</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sun, 09 Dec 2007 13:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim Zugrif auf geerbte statische Funtion on Sun, 09 Dec 2007 13:42:46 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">public ANetwork, 
       util::ASingleton&lt;CServer&gt;
</code></pre>
<p>Hier erbst du nur privat von dem Singleton.</p>
<p>Du mußt jeweils den Zugriffsmodus angeben:</p>
<pre><code class="language-cpp">public ANetwork, 
public util::ASingleton&lt;CServer&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1417556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417556</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sun, 09 Dec 2007 13:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim Zugrif auf geerbte statische Funtion on Sun, 09 Dec 2007 16:53:48 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<pre><code class="language-cpp">public ANetwork, 
       util::ASingleton&lt;CServer&gt;
</code></pre>
<p>Hier erbst du nur privat von dem Singleton.</p>
<p>Du mußt jeweils den Zugriffsmodus angeben:</p>
<pre><code class="language-cpp">public ANetwork, 
public util::ASingleton&lt;CServer&gt;
</code></pre>
</blockquote>
<p>OK genau das wars, danke.</p>
<p>@ (D)Evil:<br />
Ich war bei den Singleton-Code (ist nichtmal von mir <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ) auch etwas skeptisch, allerdings schenit das durch die Template-Regeln wirklich zu funktionieren.</p>
<p>Das mit dem auto_ptr dürfte doch gar nicht funktionieren so wie du das geschrieben hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417681</guid><dc:creator><![CDATA[darthdespotism]]></dc:creator><pubDate>Sun, 09 Dec 2007 16:53:48 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim Zugrif auf geerbte statische Funtion on Sun, 09 Dec 2007 18:38:01 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15276">@darthdespotism</a>: Hmm ich find nur nicht die Stelle wo in deinem Singleton der Speicher wieder freigegeben wird, d.h. der Destruktor aufgerufen wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
Das mitm std::auto_ptr hab ich nicht getestet ... was geht daran denn nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417749</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sun, 09 Dec 2007 18:38:01 GMT</pubDate></item></channel></rss>