<?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[Funktionsaufruf aus einer Klasseninternen Struct?]]></title><description><![CDATA[<p>Hallo</p>
<p>Aus einem Vector mit Kundennummern sollen diejenigen entfernt werden, die ein Product (Item) bereits haben. Das Predikat für remove_if bräuchte also 2 Argumente plus Zugriff auf die Map mit den Daten. Dazu wollte ich folgende Konstruktion machen:</p>
<pre><code class="language-cpp">typedef int ItemType;
class Controler
{
public:
...
    void hasItem( int customer )
    {
        return ( items[item].end() != find( items[item].begin(), items[item].end(), customer ) );
    }
    struct hasNoItem
    {
        bool operator()( int value )
        {
             return !( hasItem( value ) );
        }
    };
    void doOrder( int customer, ItemType item_ )
    {
        item = item_;
        customers.erase( remove_if( customers.begin(), customers.end(), hasNoItem() ), customers.end() );
        ...
        item = 0;
    }
private:
    ItemType item;
    map&lt;ItemType, vector&lt;int&gt; &gt; items;
    vector&lt;int&gt; customers;
};
</code></pre>
<p>Das geht nun nicht, der Fehler ist:<br />
<em>error C2352: 'Controler::hasItem' :illegal call of non-static member function</em><br />
Wenn ich die hasItem() static mache, dann kann ich aber nicht auf die Member item und items zugreifen. Wie kann ich das lösen, ev auch mit nem anderen Design?</p>
<p>edit 1 + 2: Logikfehler (!!)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156757/funktionsaufruf-aus-einer-klasseninternen-struct</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 23:08:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156757.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Aug 2006 19:05:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsaufruf aus einer Klasseninternen Struct? on Sat, 19 Aug 2006 20:01:35 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Aus einem Vector mit Kundennummern sollen diejenigen entfernt werden, die ein Product (Item) bereits haben. Das Predikat für remove_if bräuchte also 2 Argumente plus Zugriff auf die Map mit den Daten. Dazu wollte ich folgende Konstruktion machen:</p>
<pre><code class="language-cpp">typedef int ItemType;
class Controler
{
public:
...
    void hasItem( int customer )
    {
        return ( items[item].end() != find( items[item].begin(), items[item].end(), customer ) );
    }
    struct hasNoItem
    {
        bool operator()( int value )
        {
             return !( hasItem( value ) );
        }
    };
    void doOrder( int customer, ItemType item_ )
    {
        item = item_;
        customers.erase( remove_if( customers.begin(), customers.end(), hasNoItem() ), customers.end() );
        ...
        item = 0;
    }
private:
    ItemType item;
    map&lt;ItemType, vector&lt;int&gt; &gt; items;
    vector&lt;int&gt; customers;
};
</code></pre>
<p>Das geht nun nicht, der Fehler ist:<br />
<em>error C2352: 'Controler::hasItem' :illegal call of non-static member function</em><br />
Wenn ich die hasItem() static mache, dann kann ich aber nicht auf die Member item und items zugreifen. Wie kann ich das lösen, ev auch mit nem anderen Design?</p>
<p>edit 1 + 2: Logikfehler (!!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120543</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Sat, 19 Aug 2006 20:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufruf aus einer Klasseninternen Struct? on Sat, 19 Aug 2006 19:52:21 GMT]]></title><description><![CDATA[<p>Ok, hab jetzt halt die Member item und items auch static gemacht. Spielt auch keine Rolle, weils eh nur eine Instanz der Klasse geben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120573</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Sat, 19 Aug 2006 19:52:21 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufruf aus einer Klasseninternen Struct? on Mon, 21 Aug 2006 15:33:21 GMT]]></title><description><![CDATA[<p>1310-Logik schrieb:</p>
<blockquote>
<p>Ok, hab jetzt halt die Member item und items auch static gemacht. Spielt auch keine Rolle, weils eh nur eine Instanz der Klasse geben wird.</p>
</blockquote>
<p>Also ehrlich gesagt: Dann würde ich das komplett OO-frei machen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Mit statics sollte man aufpassen (auch z.B. beim Multithreading)....</p>
<p>Mal ganz global: &quot;Innere Objekte haben keinerlei Verbindung zu ihren äußeren&quot;<br />
(ganz anders als &quot;nested classes&quot; in java) .... aber dafür ist es kein Problem, dem Funktor eine Objektreferenz zu übergeben (const-correctness u.ä. habe ich mal außen vor gelassen):</p>
<pre><code class="language-cpp">class Controler
{
...	
    struct hasNoItem
    {
        hasNoItem(Controler &amp; c) : controler(c) {}
        bool operator()( int value )    {
            return !( controler.hasItem( value ) );
        }
        Controler&amp; controler;
    };

    void doOrder( int customer, ItemType item_ ) {
        item = item_;
        customers.erase( remove_if( customers.begin(), customers.end(), hasNoItem(*this) ), customers.end() );
        item = 0;
    }
...
};
</code></pre>
<p>Insgesamt finde ich die Programmierung aber zu verschachtelt (besonders die &quot;Abkürzung via remove_if&quot; mit &quot;künstlichem KlassenAttribut item&quot;) ....</p>
<p>Aber must Du selbst wissen und ich kann nicht beurteilen, ob das wirklich zu vereinfachen wäre (man darf auf mehrere Klassen einrichten, um verschiedene Zusammenhänge abzubilden <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="😉"
    /> ...)</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121650</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 21 Aug 2006 15:33:21 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufruf aus einer Klasseninternen Struct? on Mon, 21 Aug 2006 15:45:23 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Insgesamt finde ich die Programmierung aber zu verschachtelt (besonders die &quot;Abkürzung via remove_if&quot; mit &quot;künstlichem KlassenAttribut item&quot;) ....</p>
<p>Aber must Du selbst wissen und ich kann nicht beurteilen, ob das wirklich zu vereinfachen wäre (man darf auf mehrere Klassen einrichten, um verschiedene Zusammenhänge abzubilden <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="😉"
    /> ...)</p>
</blockquote>
<p>Danke mal für Deine Antwort.<br />
Ich kann das auch nicht beurteilen, kA wie ich das einfacher lösen könnt. Ist mir auch zu verschachtelt, lieber wär mir nur ein Funktionsobjekt ohne Aufruf von hasItem(), oder wenns noch anders ginge, ausser zu Fuss.<br />
Wie würdest Du es denn machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121665</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Mon, 21 Aug 2006 15:45:23 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufruf aus einer Klasseninternen Struct? on Mon, 21 Aug 2006 17:07:13 GMT]]></title><description><![CDATA[<p>Wie wärs mit Boost?</p>
<pre><code class="language-cpp">#include &lt;boost/bind.hpp&gt;
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;vector&gt;

typedef int ItemType;

class Controler {
public:
    bool hasItem(int customer, ItemType item) {
        /* klammern bei return sind doof */
        return items[item].end() != find(items[item].begin(), 
            items[item].end(), customer);
    }
    void doOrder(/* warum das hier? int customer, */ ItemType item) {
        customors.erase( std::remove_if(customors.begin(), customors.end(),
            boost::bind(boost::mem_fn(&amp;Controler::hasItem), this, _1, item)),
            customors.end() );
    }
private:
    std::map&lt;ItemType, std::vector&lt;int&gt; &gt; items;
    std::vector&lt;int&gt; customors;
};

int main() {
    Controler foo;
    foo.doOrder(0);
}
</code></pre>
<p>Habs nur compiliert, nicht getestet auf Funktion. Bin mir gar nicht sicher ob ich verstanden hab was es tuen soll <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="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121720</guid><dc:creator><![CDATA[Thomas ** 0]]></dc:creator><pubDate>Mon, 21 Aug 2006 17:07:13 GMT</pubDate></item></channel></rss>