<?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[Buchverwaltungssoftware]]></title><description><![CDATA[<p>Hi ihr,</p>
<p>Ich habe ein Programm geschrieben (zur Übung), welches es ermöglicht in einer Klasse ein bestimmtes Buch zu speichern.<br />
Die beiden Angaben, welche gemacht werden sind ISBN Nummer und Preis.<br />
Also eigentlich eine recht einfach Sache.<br />
Es gibt zwei Klassen.<br />
Die erste kann per Funktion net_price den Buchpreis zurückgeben.<br />
Die zweite Klasse erbt von der ersten und unterstützt in der Funktion net_price noch ein bestimmtes Rabattmodell.</p>
<p>Um einen Warenkorb zu realisieren, habe ich eine weitere Klasse Basket geschrieben, welche ein Set aus Elementen meiner beiden Klassen enthält.<br />
Damit im Set abgeleitete und Basisklasse gespeichert werden kann habe ich zur besseren Handhabung für den Benutzer eine Handleklasse &quot;Sales_item&quot; entwickelt.</p>
<p>Allerdings habe ich ein Problem, als ich das ganze Programm nun in mehrere Dateien unterteilt habe (Headerdatei etc).<br />
Seit ich das gemacht habe gibt der Compiler eine bescheuerte Fehlermeldung, welche ich einfach nicht wegbekomme- hatte eig nicht im Forum nachfragen wollen, weil mein Quelltext nun eig zu lang ist für nen Forenbeitrag aber ich weiß mir da einfach nicht mehr zu helfen.<br />
Aber man muss auch denke nicht durch den gesammten Quelltext durchblicken um den Fehler zu finden.<br />
Fehlermeldung vom Linker:</p>
<blockquote>
<p>[Linker error] undefined reference to `compare(Sales_item const&amp;, Sales_item const&amp;)'</p>
</blockquote>
<p>Meine Main.cpp:</p>
<pre><code class="language-csharp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;map&gt;
#include &lt;set&gt;
#include &lt;stdexcept&gt;
#include &quot;Bulk_item.h&quot;
using std::string;
using std::vector;
using std::set;
using std::cout;
using std::cin;
using std::map;
using std::cerr;
using std::endl;
using std::fstream;
using std::ifstream;
using std::ios;   
int main()
{
   Item_base ib1(&quot;Stephen King - Shining&quot;, 10);
   Sales_item si1(ib1);
   Item_base ib2(&quot;Harry Potter - Und der Stein der Weisen&quot;, 40);   
   Sales_item si2(ib2);
   Item_base ib3(&quot;Harry Potter - Und die Kammer des Schreckens&quot;, 40);      
   Sales_item si3(ib3);      
   Item_base ib4(&quot;Harry Potter - Und der gefangene von Askaban&quot;, 40);
   Sales_item si4(ib4);  
   Item_base ib5(&quot;Harry Potter - Und der Feuerkelch&quot;, 40);    
   Sales_item si5(ib5);      
   Item_base ib6(&quot;Harry Potter - Und der Orden des Phoenix&quot;, 40);
   Sales_item si6(ib6);               
   Item_base ib7(&quot;Harry Potter - Und der Halbblutprinz&quot;, 40);
   Sales_item si7(ib7);               
   Item_base ib8(&quot;Harry Potter - Und die Heiligtümer des Todes&quot;, 40);   
   Sales_item si8(ib8);                
   Bulk_item bi1(&quot;Stephen King - Carrie&quot;, 5, 3);     
   Sales_item si9(bi1);                                                       //Bei 3 Büchern gibts 20% Rabatt
   Bulk_item bi2(&quot;Stephen King - Carrie&quot;, 5, 3);
   Sales_item si10(bi2); 
   Bulk_item bi3(&quot;Stephen King - Carrie&quot;, 5, 3);
   Sales_item si11(bi3); 
   Bulk_item bi4(&quot;Ronald Tolkien - Herr der Ringe Teil 1&quot;, 10, 3);
   Sales_item si12(bi4); 
   Bulk_item bi5(&quot;Ronald Tolkien - Herr der Ringe Teil 2&quot;, 10, 3);
   Sales_item si13(bi5); 

   si13 = si1;

   Basket B;
   B.add_item(si1);
   B.add_item(si2);
   B.add_item(si3);
   B.add_item(si4);         
   B.add_item(si5);
   B.add_item(si6);
   B.add_item(si7);
   B.add_item(si8);
   B.add_item(si9);
   B.add_item(si10);
   B.add_item(si11);
   B.add_item(si12);   
   B.add_item(si13);  
   cout &lt;&lt; B.total() &lt;&lt; endl;    
   system(&quot;Pause &gt; NUL&quot;);
}
</code></pre>
<p>Die 4 Klassen:</p>
<pre><code class="language-csharp">#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;map&gt;
#include &lt;set&gt;
#include &lt;stdexcept&gt;

/**********************************************************/
class Item_base
{
   public:
      Item_base(const std::string&amp; book = &quot;&quot;, double sales_price = 0.0) : isbn(book), price(sales_price) {   }
      std::string book() const
      {
         return isbn;            
      }
      virtual double net_price(std::size_t n) const
      {
         return n * price;        
      }
      virtual ~Item_base() {   }
      virtual Item_base* clone() const
      {
         return new Item_base(*this);        
      }
   private:
      std::string isbn;
   protected:
      double price;
};
/**********************************************************/
class Bulk_item : public Item_base
{
   public:
      double net_price(std::size_t) const;
      Bulk_item* clone() const
      {
         return new Bulk_item(*this);           
      }
      Bulk_item(const std::string&amp; book, double sales_price, std::size_t qty, double disc_rate = 0.2): //Bekommt Standardmäßig 20%
                Item_base(book, sales_price), min_qty(qty), discount(disc_rate)   {   }
   private:    
      std::size_t min_qty;
      double discount;
};
class Sales_item
{
   public:
      Sales_item(): p(0), use(new std::size_t(1)) {   }
      Sales_item(const Item_base&amp; item):p(item.clone()), use(new std::size_t(1)){    }
      Sales_item(const Sales_item &amp;i): p(i.p), use(i.use)    {   }   
      void decr_use(); 
      ~Sales_item() 
      {
         decr_use();              
      }
      Sales_item&amp; operator=(const Sales_item&amp;);
      const Item_base *operator-&gt;() const;
      const Item_base &amp;operator*() const;     
   private:
      Item_base * p;
      std::size_t *use;      
};
//Funktionsdeklarationen:
inline bool compare(const Sales_item &amp;lhs,const Sales_item&amp; rhs)
{
   return lhs-&gt;book() &lt; rhs-&gt;book();     
}

/**********************************************************/
class Basket
{
   typedef bool(*Comp) (const Sales_item&amp;, const Sales_item&amp;);
   public:
      typedef std::multiset&lt;Sales_item, Comp&gt; set_type;
      typedef set_type::size_type size_type;
      typedef set_type::const_iterator const_iter;
      Basket(): items(compare) {   }                   //items wird hier nicht mit 'compare' initialisiert, sondern bentutz die Funktion 'compare' zum Ordnen seiner Elemente.
      double total() const; 
      void add_item(const Sales_item &amp;item)
      {
         items.insert(item);     
      }    
      size_type size(const Sales_item &amp;i) const
      {
         return items.count(i);          
      }    
   private:
      std::multiset&lt;Sales_item, Comp&gt; items;
};
/**********************************************************/
</code></pre>
<p>Funktionsdefinitionen der 4 Klassen:</p>
<pre><code class="language-csharp">#include &quot;Bulk_item.h&quot;
//Memberfunktionen von Bulk_item:
double Bulk_item::net_price(size_t cnt) const
{
   if(cnt &gt;= min_qty)
      return cnt * (1-discount) * price;
   else
      return cnt*price;       
}
//Memberfunktionen von Item_base:
const Item_base* Sales_item::operator-&gt;() const
{
   if(p) 
   {
      return p;      
   }
   else
   {
      throw std::logic_error(&quot;Ungültiges Objekt&quot;);    
   }
}
const Item_base&amp; Sales_item::operator*() const
{
   if(p)
   {
      return *p;     
   }      
   else
   {
      throw std::logic_error(&quot;Ungültiges Objektm&quot;);
   }
}
//Memberfunktionen von Sales_item:
double Basket::total() const
{
   double sum = 0.0;
   for(Basket::const_iter iter = items.begin(); iter != items.end(); iter = items.upper_bound(*iter)) //upper_bound gibt einen Iterator auf das erste 
   {                                                                                          //Element zurück, welches größer als *iter ist.
      sum += (*iter)-&gt;net_price(items.count(*iter));
   }       
   return sum;
}
void Sales_item::decr_use()
{
    if(--*use == 0)
    {
       delete p; 
       delete use;          
    }     
}
Sales_item&amp; Sales_item::operator=(const Sales_item &amp;rhs)
{
   ++*rhs.use;
   decr_use();
   p = rhs.p;
   use = rhs.use;
   return *this;            
}
</code></pre>
<p>Die Funktion, welche den Vergleichsoperator des Vektors überschreibt, heißt compare und ist von mir als inline gekennzeichnet worden, da sie nur einmal aufgerufen wird.</p>
<p>Ich hoffe der Quelltext überrumpelt keinen und jemand von euch weiß, was ich beim aufteilen der Dateien falsch gemacht habe- steht alles in einer Datei gehts <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>Tschüss</p>
<p>David</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206230/buchverwaltungssoftware</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 06:53:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206230.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Feb 2008 12:21:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 13:08:45 GMT]]></title><description><![CDATA[<p>Hi ihr,</p>
<p>Ich habe ein Programm geschrieben (zur Übung), welches es ermöglicht in einer Klasse ein bestimmtes Buch zu speichern.<br />
Die beiden Angaben, welche gemacht werden sind ISBN Nummer und Preis.<br />
Also eigentlich eine recht einfach Sache.<br />
Es gibt zwei Klassen.<br />
Die erste kann per Funktion net_price den Buchpreis zurückgeben.<br />
Die zweite Klasse erbt von der ersten und unterstützt in der Funktion net_price noch ein bestimmtes Rabattmodell.</p>
<p>Um einen Warenkorb zu realisieren, habe ich eine weitere Klasse Basket geschrieben, welche ein Set aus Elementen meiner beiden Klassen enthält.<br />
Damit im Set abgeleitete und Basisklasse gespeichert werden kann habe ich zur besseren Handhabung für den Benutzer eine Handleklasse &quot;Sales_item&quot; entwickelt.</p>
<p>Allerdings habe ich ein Problem, als ich das ganze Programm nun in mehrere Dateien unterteilt habe (Headerdatei etc).<br />
Seit ich das gemacht habe gibt der Compiler eine bescheuerte Fehlermeldung, welche ich einfach nicht wegbekomme- hatte eig nicht im Forum nachfragen wollen, weil mein Quelltext nun eig zu lang ist für nen Forenbeitrag aber ich weiß mir da einfach nicht mehr zu helfen.<br />
Aber man muss auch denke nicht durch den gesammten Quelltext durchblicken um den Fehler zu finden.<br />
Fehlermeldung vom Linker:</p>
<blockquote>
<p>[Linker error] undefined reference to `compare(Sales_item const&amp;, Sales_item const&amp;)'</p>
</blockquote>
<p>Meine Main.cpp:</p>
<pre><code class="language-csharp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;map&gt;
#include &lt;set&gt;
#include &lt;stdexcept&gt;
#include &quot;Bulk_item.h&quot;
using std::string;
using std::vector;
using std::set;
using std::cout;
using std::cin;
using std::map;
using std::cerr;
using std::endl;
using std::fstream;
using std::ifstream;
using std::ios;   
int main()
{
   Item_base ib1(&quot;Stephen King - Shining&quot;, 10);
   Sales_item si1(ib1);
   Item_base ib2(&quot;Harry Potter - Und der Stein der Weisen&quot;, 40);   
   Sales_item si2(ib2);
   Item_base ib3(&quot;Harry Potter - Und die Kammer des Schreckens&quot;, 40);      
   Sales_item si3(ib3);      
   Item_base ib4(&quot;Harry Potter - Und der gefangene von Askaban&quot;, 40);
   Sales_item si4(ib4);  
   Item_base ib5(&quot;Harry Potter - Und der Feuerkelch&quot;, 40);    
   Sales_item si5(ib5);      
   Item_base ib6(&quot;Harry Potter - Und der Orden des Phoenix&quot;, 40);
   Sales_item si6(ib6);               
   Item_base ib7(&quot;Harry Potter - Und der Halbblutprinz&quot;, 40);
   Sales_item si7(ib7);               
   Item_base ib8(&quot;Harry Potter - Und die Heiligtümer des Todes&quot;, 40);   
   Sales_item si8(ib8);                
   Bulk_item bi1(&quot;Stephen King - Carrie&quot;, 5, 3);     
   Sales_item si9(bi1);                                                       //Bei 3 Büchern gibts 20% Rabatt
   Bulk_item bi2(&quot;Stephen King - Carrie&quot;, 5, 3);
   Sales_item si10(bi2); 
   Bulk_item bi3(&quot;Stephen King - Carrie&quot;, 5, 3);
   Sales_item si11(bi3); 
   Bulk_item bi4(&quot;Ronald Tolkien - Herr der Ringe Teil 1&quot;, 10, 3);
   Sales_item si12(bi4); 
   Bulk_item bi5(&quot;Ronald Tolkien - Herr der Ringe Teil 2&quot;, 10, 3);
   Sales_item si13(bi5); 

   si13 = si1;

   Basket B;
   B.add_item(si1);
   B.add_item(si2);
   B.add_item(si3);
   B.add_item(si4);         
   B.add_item(si5);
   B.add_item(si6);
   B.add_item(si7);
   B.add_item(si8);
   B.add_item(si9);
   B.add_item(si10);
   B.add_item(si11);
   B.add_item(si12);   
   B.add_item(si13);  
   cout &lt;&lt; B.total() &lt;&lt; endl;    
   system(&quot;Pause &gt; NUL&quot;);
}
</code></pre>
<p>Die 4 Klassen:</p>
<pre><code class="language-csharp">#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;map&gt;
#include &lt;set&gt;
#include &lt;stdexcept&gt;

/**********************************************************/
class Item_base
{
   public:
      Item_base(const std::string&amp; book = &quot;&quot;, double sales_price = 0.0) : isbn(book), price(sales_price) {   }
      std::string book() const
      {
         return isbn;            
      }
      virtual double net_price(std::size_t n) const
      {
         return n * price;        
      }
      virtual ~Item_base() {   }
      virtual Item_base* clone() const
      {
         return new Item_base(*this);        
      }
   private:
      std::string isbn;
   protected:
      double price;
};
/**********************************************************/
class Bulk_item : public Item_base
{
   public:
      double net_price(std::size_t) const;
      Bulk_item* clone() const
      {
         return new Bulk_item(*this);           
      }
      Bulk_item(const std::string&amp; book, double sales_price, std::size_t qty, double disc_rate = 0.2): //Bekommt Standardmäßig 20%
                Item_base(book, sales_price), min_qty(qty), discount(disc_rate)   {   }
   private:    
      std::size_t min_qty;
      double discount;
};
class Sales_item
{
   public:
      Sales_item(): p(0), use(new std::size_t(1)) {   }
      Sales_item(const Item_base&amp; item):p(item.clone()), use(new std::size_t(1)){    }
      Sales_item(const Sales_item &amp;i): p(i.p), use(i.use)    {   }   
      void decr_use(); 
      ~Sales_item() 
      {
         decr_use();              
      }
      Sales_item&amp; operator=(const Sales_item&amp;);
      const Item_base *operator-&gt;() const;
      const Item_base &amp;operator*() const;     
   private:
      Item_base * p;
      std::size_t *use;      
};
//Funktionsdeklarationen:
inline bool compare(const Sales_item &amp;lhs,const Sales_item&amp; rhs)
{
   return lhs-&gt;book() &lt; rhs-&gt;book();     
}

/**********************************************************/
class Basket
{
   typedef bool(*Comp) (const Sales_item&amp;, const Sales_item&amp;);
   public:
      typedef std::multiset&lt;Sales_item, Comp&gt; set_type;
      typedef set_type::size_type size_type;
      typedef set_type::const_iterator const_iter;
      Basket(): items(compare) {   }                   //items wird hier nicht mit 'compare' initialisiert, sondern bentutz die Funktion 'compare' zum Ordnen seiner Elemente.
      double total() const; 
      void add_item(const Sales_item &amp;item)
      {
         items.insert(item);     
      }    
      size_type size(const Sales_item &amp;i) const
      {
         return items.count(i);          
      }    
   private:
      std::multiset&lt;Sales_item, Comp&gt; items;
};
/**********************************************************/
</code></pre>
<p>Funktionsdefinitionen der 4 Klassen:</p>
<pre><code class="language-csharp">#include &quot;Bulk_item.h&quot;
//Memberfunktionen von Bulk_item:
double Bulk_item::net_price(size_t cnt) const
{
   if(cnt &gt;= min_qty)
      return cnt * (1-discount) * price;
   else
      return cnt*price;       
}
//Memberfunktionen von Item_base:
const Item_base* Sales_item::operator-&gt;() const
{
   if(p) 
   {
      return p;      
   }
   else
   {
      throw std::logic_error(&quot;Ungültiges Objekt&quot;);    
   }
}
const Item_base&amp; Sales_item::operator*() const
{
   if(p)
   {
      return *p;     
   }      
   else
   {
      throw std::logic_error(&quot;Ungültiges Objektm&quot;);
   }
}
//Memberfunktionen von Sales_item:
double Basket::total() const
{
   double sum = 0.0;
   for(Basket::const_iter iter = items.begin(); iter != items.end(); iter = items.upper_bound(*iter)) //upper_bound gibt einen Iterator auf das erste 
   {                                                                                          //Element zurück, welches größer als *iter ist.
      sum += (*iter)-&gt;net_price(items.count(*iter));
   }       
   return sum;
}
void Sales_item::decr_use()
{
    if(--*use == 0)
    {
       delete p; 
       delete use;          
    }     
}
Sales_item&amp; Sales_item::operator=(const Sales_item &amp;rhs)
{
   ++*rhs.use;
   decr_use();
   p = rhs.p;
   use = rhs.use;
   return *this;            
}
</code></pre>
<p>Die Funktion, welche den Vergleichsoperator des Vektors überschreibt, heißt compare und ist von mir als inline gekennzeichnet worden, da sie nur einmal aufgerufen wird.</p>
<p>Ich hoffe der Quelltext überrumpelt keinen und jemand von euch weiß, was ich beim aufteilen der Dateien falsch gemacht habe- steht alles in einer Datei gehts <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>Tschüss</p>
<p>David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460900</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 22 Feb 2008 13:08:45 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 12:48:47 GMT]]></title><description><![CDATA[<p>Includierst du die Dateien alle in der richtige Reihenfolge bzw. includierst du sie überhaupt?<br />
Weil so wie ich das beim Überfliegen mit bekommen habe, scheint es nicht so...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460921</guid><dc:creator><![CDATA[Fake oder Echt]]></dc:creator><pubDate>Fri, 22 Feb 2008 12:48:47 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 12:57:10 GMT]]></title><description><![CDATA[<p>Eigentlich müsste es stimmen.<br />
In der Cpp in der die Methodendefinitionen stehen ist die Headerdatei eingebunden.<br />
In die MainCpp ebenfalls die Headerdatei.<br />
Der Linker findet Cpp datei auch.</p>
<p>Was sollte ich denn ändern?<br />
Wie ists denn guter Programmierstil?^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460929</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 22 Feb 2008 12:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 13:00:37 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>Ich hoffe der Quelltext überrumpelt keinen und jemand von euch weiß, was ich beim aufteilen der Dateien falsch gemacht habe...</p>
</blockquote>
<p>1. Inkludiere nur das was du in der konkreten Codeeinheit benötigst (Ebenso sind deine using-Anweisungen auf unnötige Bestandteile)</p>
<p>2. Du hast schon mehrfach gepostet und solltes auch wissen das man die c++ Tags und nicht die Codetags einsetzten sollte (Erhöht ebenso die lesbarkeit ungemein).</p>
<p>3. Dir ist hoffentlich bewusst das Zeiger auf Inlinefunktionen nicht funktionieren können (Inline wird wie der Name schon sagt bei der Benutzung aufgelöst und hat daher keine Ansprungadresse).</p>
<p>4. Auch wenn du es erwähnt hast, ändert es nichts daran das du lieber eine Codeeinheit pro Klasse verwenden solltest. Und die Definitionen sollten auch im Source nicht im Header enthalten sein.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460932</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 22 Feb 2008 13:00:37 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 13:13:21 GMT]]></title><description><![CDATA[<p>Also wenn ich 3 klassen und eine Main.cpp habe, müsste ich im Endeffekt 7 Dateien dadraus machen, weil 3 Headerdateien, 3 CPP-Funktsiondefinitionen, 1 Main.cpp</p>
<p>Allerdings müssten Inlinefunktionen doch im Header definiert werden- müsste doch ne Ausnahme sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460942</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 22 Feb 2008 13:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 14:11:02 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>Also wenn ich 3 klassen und eine Main.cpp habe, müsste ich im Endeffekt 7 Dateien dadraus machen, weil 3 Headerdateien, 3 CPP-Funktsiondefinitionen, 1 Main.cpp</p>
<p>Allerdings müssten Inlinefunktionen doch im Header definiert werden- müsste doch ne Ausnahme sein.</p>
</blockquote>
<p>Ja, nur sehe ich dort noch deutlich mehr Methodendefinitionen (Ändert aber nichts daran das von Inlines keine Funktionszeiger angelegt werden können ;p).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460980</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 22 Feb 2008 14:11:02 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 14:32:25 GMT]]></title><description><![CDATA[<p>Wo ist denn einer in meinem Quelltext?<br />
Ich habe lediglich einen typedef, welcher für einen Zeiger, welcher auf eine solche Funktion zeigt definiert.<br />
Dieser ist aber notwendig, weil Vektor einen Zeiger und keine volle Funktion erwartet.<br />
Das ganze funktioniert ja auch, wenn alle Dateien in einem Projekt stehen:</p>
<p>Folgender Quelltext lässt sich ohne Probleme compilieren:</p>
<pre><code class="language-csharp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;map&gt;
#include &lt;set&gt;
#include &lt;stdexcept&gt;
/**********************************************************/
class Item_base
{
   public:
      Item_base(const std::string&amp; book = &quot;&quot;, double sales_price = 0.0) : isbn(book), price(sales_price) {   }
      std::string book() const
      {
         return isbn;            
      }
      virtual double net_price(std::size_t n) const
      {
         return n * price;        
      }
      virtual ~Item_base() {   }
      virtual Item_base* clone() const
      {
         return new Item_base(*this);        
      }
   private:
      std::string isbn;
   protected:
      double price;
};
/**********************************************************/
class Bulk_item : public Item_base
{
   public:
      double net_price(std::size_t) const;
      Bulk_item* clone() const
      {
         return new Bulk_item(*this);           
      }
      Bulk_item(const std::string&amp; book, double sales_price, std::size_t qty, double disc_rate = 0.2): //Bekommt Standardmäßig 20%
                Item_base(book, sales_price), min_qty(qty), discount(disc_rate)   {   }
   private:    
      std::size_t min_qty;
      double discount;
};
double Bulk_item::net_price(size_t cnt) const
{
   if(cnt &gt;= min_qty)
      return cnt * (1-discount) * price;
   else
      return cnt*price;       
}
/**********************************************************/
class Sales_item
{
   public:
      Sales_item(): p(0), use(new std::size_t(1)) {   }
      Sales_item(const Item_base&amp; item):p(item.clone()), use(new std::size_t(1)){    }
      Sales_item(const Sales_item &amp;i): p(i.p), use(i.use) 
      {     
         *use++;
      }    
      ~Sales_item() 
      {
         decr_use();              
      }
      Sales_item&amp; operator=(const Sales_item&amp;);
      const Item_base *operator-&gt;() const
      {
         if(p) 
         {
            return p;      
         }
         else
         {
            throw std::logic_error(&quot;Ungültiges Objekt&quot;);    
         }
      }
      const Item_base &amp;operator*() const
      {
         if(p)
         {
            return *p;     
         }      
         else
         {
            throw std::logic_error(&quot;Ungültiges Objektm&quot;);
         }
      }
   private:
      Item_base * p;
      std::size_t *use;
      void decr_use()
      {
         if(--*use == 0)
         {
            delete p; 
            delete use;          
         }     
      }

};
Sales_item&amp; Sales_item::operator=(const Sales_item &amp;rhs)
{
   ++*rhs.use;
   decr_use();
   p = rhs.p;
   use = rhs.use;
   return *this;            
}

inline bool compare(const Sales_item &amp;lhs, const Sales_item &amp;rhs)
{
   return lhs-&gt;book() &lt; rhs-&gt;book();       
}

/**********************************************************/
class Basket
{
   typedef bool(*Comp) (const Sales_item&amp;, const Sales_item&amp;);
   public:
      typedef std::multiset&lt;Sales_item, Comp&gt; set_type;
      typedef set_type::size_type size_type;
      typedef set_type::const_iterator const_iter;
      Basket(): items(compare) {   }                   //items wird hier nicht mit 'compare' initialisiert, sondern bentutz die Funktion 'compare' zum Ordnen seiner Elemente.
      void add_item(const Sales_item &amp;item)
      {
         items.insert(item);     
      }    
      size_type size(const Sales_item &amp;i) const
      {
         return items.count(i);          
      }
      double total() const
      {
         double sum = 0.0;
         for(const_iter iter = items.begin(); iter != items.end(); iter = items.upper_bound(*iter)) //upper_bound gibt einen Iterator auf das erste 
         {                                                                                          //Element zurück, welches größer als *iter ist.
            sum += (*iter)-&gt;net_price(items.count(*iter));
         }       
         return sum;
      }
   private:
      std::multiset&lt;Sales_item, Comp&gt; items;

};
/**********************************************************/
using std::string;
using std::vector;
using std::set;
using std::cout;
using std::cin;
using std::map;
using std::cerr;
using std::endl;
using std::fstream;
using std::ifstream;
using std::ios;   
int main()
{
   Item_base ib1(&quot;Stephen King - Shining&quot;, 10);
   Sales_item si1(ib1);
   Item_base ib2(&quot;Harry Potter - Und der Stein der Weisen&quot;, 40);   
   Sales_item si2(ib2);
   Item_base ib3(&quot;Harry Potter - Und die Kammer des Schreckens&quot;, 40);      
   Sales_item si3(ib3);      
   Item_base ib4(&quot;Harry Potter - Und der gefangene von Askaban&quot;, 40);
   Sales_item si4(ib4);  
   Item_base ib5(&quot;Harry Potter - Und der Feuerkelch&quot;, 40);    
   Sales_item si5(ib5);      
   Item_base ib6(&quot;Harry Potter - Und der Orden des Phoenix&quot;, 40);
   Sales_item si6(ib6);               
   Item_base ib7(&quot;Harry Potter - Und der Halbblutprinz&quot;, 40);
   Sales_item si7(ib7);               
   Item_base ib8(&quot;Harry Potter - Und die Heiligtümer des Todes&quot;, 40);   
   Sales_item si8(ib8);                
   Bulk_item bi1(&quot;Stephen King - Carrie&quot;, 5, 3);     
   Sales_item si9(bi1);                                                       //Bei 3 Büchern gibts 20% Rabatt
   Bulk_item bi2(&quot;Stephen King - Carrie&quot;, 5, 3);
   Sales_item si10(bi2); 
   Bulk_item bi3(&quot;Stephen King - Carrie&quot;, 5, 3);
   Sales_item si11(bi3); 
   Bulk_item bi4(&quot;Ronald Tolkien - Herr der Ringe Teil 1&quot;, 10, 3);
   Sales_item si12(bi4); 
   Bulk_item bi5(&quot;Ronald Tolkien - Herr der Ringe Teil 2&quot;, 10, 3);
   Sales_item si13(bi5); 

   si13 = si1;

   Basket B;
   B.add_item(si1);
   B.add_item(si2);
   B.add_item(si3);
   B.add_item(si4);         
   B.add_item(si5);
   B.add_item(si6);
   B.add_item(si7);
   B.add_item(si8);
   B.add_item(si9);
   B.add_item(si10);
   B.add_item(si11);
   B.add_item(si12);   
   B.add_item(si13);  
   cout &lt;&lt; B.total() &lt;&lt; endl;    
   system(&quot;Pause &gt; NUL&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1460990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460990</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 22 Feb 2008 14:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 14:43:09 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>3. Dir ist hoffentlich bewusst das Zeiger auf Inlinefunktionen nicht funktionieren können (Inline wird wie der Name schon sagt bei der Benutzung aufgelöst und hat daher keine Ansprungadresse).</p>
</blockquote>
<p>Unfug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461001</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 22 Feb 2008 14:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 15:01:17 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>3. Dir ist hoffentlich bewusst das Zeiger auf Inlinefunktionen nicht funktionieren können (Inline wird wie der Name schon sagt bei der Benutzung aufgelöst und hat daher keine Ansprungadresse).</p>
</blockquote>
<p>Unfug.</p>
</blockquote>
<p>Okay, habe nachgeschaut, hast recht. In dem Fall ist das inline aber unnütz, da es eh &quot;entfernt&quot; wird.</p>
<blockquote>
<p><em>If you do this, the compiler will place a normal subroutine version of the inline's implementation in an object file and give you the address of that, so the function pointer does not really point to an inline function at all.</em></p>
</blockquote>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461013</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 22 Feb 2008 15:01:17 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 15:02:47 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Okay, habe nachgeschaut, hast recht. In dem Fall ist das inline aber unnütz, da es eh &quot;entfernt&quot; wird.</p>
</blockquote>
<p>Nicht wirklich. Wenn die inline Funktion auch ohne den Funktionspointer verwendet wird, macht sie schon Sinn. Denn es passiert dann beides: inlining und der Aufbau der eigentlichen Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461015</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 22 Feb 2008 15:02:47 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 15:20:37 GMT]]></title><description><![CDATA[<p>In der main-Funktion könntest du auch mit Arrays/Vectoren arbeiten:</p>
<pre><code class="language-cpp">int main()
{
    vector&lt;Sales_item&gt; items;
    items.push_back( Item_base( &quot;Stephen King - Shining&quot;, 10 ) );
    items.push_back( Item_base( &quot;Harry Potter - Und der Stein der Weisen&quot;, 40 ) );
    items.push_back( Item_base( &quot;Harry Potter - Und die Kammer des Schreckens&quot;, 40 ) );
    ...
    items.push_back( Bulk_item( &quot;Stephen King - Carrie&quot;, 5, 3 ) );
    ...

    Basket B;
    for ( vector&lt;Sales_item&gt;::const_iterator itemIter=items.begin(); itemIter!=items.end(); itemIter++ )
        B.add_item( *itemIter );

    ...
}
</code></pre>
<p>So ungefähr.. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1461036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461036</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 22 Feb 2008 15:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Buchverwaltungssoftware on Fri, 22 Feb 2008 15:32:12 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>3. Dir ist hoffentlich bewusst das Zeiger auf Inlinefunktionen nicht funktionieren können (Inline wird wie der Name schon sagt bei der Benutzung aufgelöst und hat daher keine Ansprungadresse).</p>
</blockquote>
<p>Unfug.</p>
</blockquote>
<p>Okay, habe nachgeschaut, hast recht. In dem Fall ist das inline aber unnütz, da es eh &quot;entfernt&quot; wird.</p>
<blockquote>
<p><em>If you do this, the compiler will place a normal subroutine version of the inline's implementation in an object file and give you the address of that, so the function pointer does not really point to an inline function at all.</em></p>
</blockquote>
<p>cu André</p>
</blockquote>
<p>Es ist trotzdem notwendig, wenn diese Funktion weiterhin im Header definiert werden soll (Alternativen: nicht im Header definieren, Funktion static machen oder in einen unbenannten Namensraum verschieben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461047</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 22 Feb 2008 15:32:12 GMT</pubDate></item></channel></rss>