<?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[Problem Faktorisierung Klassen]]></title><description><![CDATA[<p>Zuerst mal einen schönen guten Morgen ins Forum!</p>
<p>Ich habe ein Problem. Und zwar bin ich ziemlicher C++ Anfänger und will jetzt eine knifflige Case Anweisung programmieren:</p>
<p>State of the Art:<br />
Was will ich?<br />
Ich bekomme einen int Wert mit dem Namen AlgoId rein und will jetzt sagen, welchen Algorithmus er aufrufen soll. Das geht doch am Besten mit einer Case Anweisung, oder?<br />
Allerdings weiß ich nicht so ganz, wie ich dann die Algos aufrufe.</p>
<p>Vielleicht zur Verdeutlichung meinen Code:</p>
<p>1. .h File</p>
<pre><code class="language-cpp">#ifndef algorithm_h_included
#define algorithm_h_included

#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

class Algorithm{

public:
  algorithm();

  Algorithm algoId(int);
  void type (int);
  virtual bool identify ()=0;
  void storeResult (int Res [2][1&rsqb;&rsqb;;

  virtual ~algorithm();
};

class Aaa: public Algorithm {

public:
      aaa( type = Aaa);  // ??????????  Konstruktormit Type?
      bool identify();
      virtual ~aaa();

private: 
      ...
};

class Bbb: public Algorithm {

public:
    bbb(type = Bbb);
    bool identify();
    virtual ~bbb();

private:
   ...
};

class Ccc: public Algorithm {

public: 
  ccc(type = Ccc);
  bool identify();
  virtual ~ccc();

private:
...
};

#endif
</code></pre>
<p>2. .cpp File</p>
<pre><code class="language-cpp">#include &quot;Algorithm.h&quot;

#define Aaa= 0;
#define Bbb= 1;
#define Ccc= 2;

algorithm::algorithm()
{}

Aaa:algorithm(){};
Bbb::algorithm(){};
Ccc::algorithm(){};

Algorithm Init (int algoID){

  switch (algoId)
  { case 0:
        algo = new algorithm (Aaa);
        break;
    case 1:
        algo = new algorithm (Bbb);
        break;
    case 2:
        algo = new algorithm (Ccc);
        break;
 return algo;
}

algorithm::~algorithm()
{}
</code></pre>
<p>Macht das so Sinn????<br />
Das AlgoId bekomme ich aus einer anderen Klasse in einem anderen Projekt...</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/136922/problem-faktorisierung-klassen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 14:58:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/136922.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Feb 2006 09:58:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 09:58:18 GMT]]></title><description><![CDATA[<p>Zuerst mal einen schönen guten Morgen ins Forum!</p>
<p>Ich habe ein Problem. Und zwar bin ich ziemlicher C++ Anfänger und will jetzt eine knifflige Case Anweisung programmieren:</p>
<p>State of the Art:<br />
Was will ich?<br />
Ich bekomme einen int Wert mit dem Namen AlgoId rein und will jetzt sagen, welchen Algorithmus er aufrufen soll. Das geht doch am Besten mit einer Case Anweisung, oder?<br />
Allerdings weiß ich nicht so ganz, wie ich dann die Algos aufrufe.</p>
<p>Vielleicht zur Verdeutlichung meinen Code:</p>
<p>1. .h File</p>
<pre><code class="language-cpp">#ifndef algorithm_h_included
#define algorithm_h_included

#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

class Algorithm{

public:
  algorithm();

  Algorithm algoId(int);
  void type (int);
  virtual bool identify ()=0;
  void storeResult (int Res [2][1&rsqb;&rsqb;;

  virtual ~algorithm();
};

class Aaa: public Algorithm {

public:
      aaa( type = Aaa);  // ??????????  Konstruktormit Type?
      bool identify();
      virtual ~aaa();

private: 
      ...
};

class Bbb: public Algorithm {

public:
    bbb(type = Bbb);
    bool identify();
    virtual ~bbb();

private:
   ...
};

class Ccc: public Algorithm {

public: 
  ccc(type = Ccc);
  bool identify();
  virtual ~ccc();

private:
...
};

#endif
</code></pre>
<p>2. .cpp File</p>
<pre><code class="language-cpp">#include &quot;Algorithm.h&quot;

#define Aaa= 0;
#define Bbb= 1;
#define Ccc= 2;

algorithm::algorithm()
{}

Aaa:algorithm(){};
Bbb::algorithm(){};
Ccc::algorithm(){};

Algorithm Init (int algoID){

  switch (algoId)
  { case 0:
        algo = new algorithm (Aaa);
        break;
    case 1:
        algo = new algorithm (Bbb);
        break;
    case 2:
        algo = new algorithm (Ccc);
        break;
 return algo;
}

algorithm::~algorithm()
{}
</code></pre>
<p>Macht das so Sinn????<br />
Das AlgoId bekomme ich aus einer anderen Klasse in einem anderen Projekt...</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993741</guid><dc:creator><![CDATA[Alex179]]></dc:creator><pubDate>Tue, 14 Feb 2006 09:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 10:09:10 GMT]]></title><description><![CDATA[<p>Nein, das macht wenig Sinn - schau dir nochmal genauer an, wie man mit virtuellen Klassen umgehen sollte:</p>
<pre><code class="language-cpp">class algo
{
public:
  algo();
  virtual void calc(int data)=0;
  virtual ~algo();
};

class Aaa : public algo
{
public:
  Aaa(...);
  void calc(int data);
  ~Aaa();
};

class Bbb : public algo
{
  //analog zu Aaa
};

enum{aaa,bbb,...} algo_type;

algo* init(algo_type t)
{
  switch(t)
  {
  case aaa:return new Aaa(...);
  case bbb:return new Bbb(...);
  ...
  default: return NULL;
  }
}
</code></pre>
<p>(oder du googlest mal nach &quot;virtueller Konstruktor&quot;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993753</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 14 Feb 2006 10:09:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 10:15:23 GMT]]></title><description><![CDATA[<p>Danke.... Ich bekomme ja die AlgoId extern rein. Die ist entweder 0,1, oder 2.</p>
<p>Muss ich dann trotzdem noch das Enum definieren? Wenn ja wo? im Header?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993756</guid><dc:creator><![CDATA[Alex179]]></dc:creator><pubDate>Tue, 14 Feb 2006 10:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 10:24:06 GMT]]></title><description><![CDATA[<p>Noch ne Frage: meine Funktion calc(int data) data ist doch dann eigentlich das was übergeben wird, das, was ich berechnen will?</p>
<p>Will ich meine Funktion calc jetzt mit dem Algorithmus aufrufen, der bei der Switsch/Case Anweidung rauskam, mache ich das wie?</p>
<p>Aaa.calc(int data) ????</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993764</guid><dc:creator><![CDATA[Alex179]]></dc:creator><pubDate>Tue, 14 Feb 2006 10:24:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 10:25:18 GMT]]></title><description><![CDATA[<p>Das enum ist eleganter wie deine defines. Du musst zudem jetzt nicht mehr immer nachsehen um welche Zahl es sich handelt um einen bestimmten Typ zu erhalten. Du übergibst der Variablen vom Typ algo_type einfach aaa, bbb, ... Letztendlich sind das auch nur Zahlen. In deinem Fall ist aaa=0, bbb=1 usw. Dafür aber wesentlich eleganter.<br />
Ja, die enum-Definition kannst du in den Header packen, damit ihn auch jeder Benutzen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993765</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Tue, 14 Feb 2006 10:25:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 10:28:08 GMT]]></title><description><![CDATA[<p>Alex179 schrieb:</p>
<blockquote>
<p>Noch ne Frage: meine Funktion calc(int data) data ist doch dann eigentlich das was übergeben wird, das, was ich berechnen will?</p>
<p>Will ich meine Funktion calc jetzt mit dem Algorithmus aufrufen, der bei der Switsch/Case Anweidung rauskam, mache ich das wie?</p>
<p>Aaa.calc(int data) ????</p>
</blockquote>
<p>Du bekommst von der Funktion (s. die Funktion von CStoll) einen Zeiger zurück und dann greifst du mit dem Pfeiloperator auf die Funktion zur Berechnung zu, es wird automatisch die richtige verwendet:</p>
<pre><code class="language-cpp">algo* ptr = init(aaa);
prt-&gt;calc(data); // data wurde zuvor irgendwo definiert
</code></pre>
<p>Hier wird das calc von aaa aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993767</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Tue, 14 Feb 2006 10:28:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 10:30:22 GMT]]></title><description><![CDATA[<p>Alex179 schrieb:</p>
<blockquote>
<p>Will ich meine Funktion calc jetzt mit dem Algorithmus aufrufen, der bei der Switsch/Case Anweidung rauskam, mache ich das wie?</p>
<p>Aaa.calc(int data) ????</p>
</blockquote>
<p>Fast:</p>
<pre><code class="language-cpp">int main()
{
  algo_type typ=...;
  algo* my_algo = init(typ);
  my_algo-&gt;calc(4711);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/993770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993770</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 14 Feb 2006 10:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 10:59:00 GMT]]></title><description><![CDATA[<p>Irgendwie funktiuoniert das immmernoch nicht richtig...<br />
Nehmen wir an ich setze die algoId auf 1.</p>
<p>Rufe dann extern auf:</p>
<pre><code class="language-cpp">Algo* algo = init (algoID);
algo-&gt;identify (img);
</code></pre>
<p>Und ich habe in meinem Header:</p>
<pre><code class="language-cpp">class Algo{

public:
  Algo();
  void init(int algoID);
  virtual bool identify (int data)=0;

  virtual ~Algo();
};
</code></pre>
<p>in der cpp den switch:</p>
<pre><code class="language-cpp">enum{yuv,nccf,sift} algoID;

Algo* init(algoId)
{
  switch(algoID)
  {
  case 0:return new YUV(); break;
  case 1:return new NCCF(); break;
  case 2:return new SIFT(); break;
  default: return NULL;
  }
} ;
</code></pre>
<p>Aber wieso gibt er mir Fehler, dass Klammern fehlen und und und?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993797</guid><dc:creator><![CDATA[Alex 179]]></dc:creator><pubDate>Tue, 14 Feb 2006 10:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 11:39:31 GMT]]></title><description><![CDATA[<p>Dein algoID enum is in der cpp definiert ?</p>
<p>die Algo klasse selber braucht die algo ID definition aber auch ! oder ? (hat ja schliesslich nen parameter.</p>
<p>da die Algo ID zu deiner Algo klasse im logischen sinne gehoert, wuerd ich die ID in die Klasse stecken ....</p>
<p>init ist eine Methode an der Algo klasse, aufrufen tust die aber ohne Instanz ?<br />
Algo* algo = init (algoID); Sollte nicht gehen, weil er die init methode nicht finden sollte ...<br />
Dein init gehoert aber logisch genau so zu deiner Algo klasse -&gt; typischer einsatzfall von statischen memberfunktionen !</p>
<pre><code class="language-cpp">class Algo{

public:

  enum{yuv,nccf,sift} algoID;

  Algo();
  static Algo * init(int algoID); // wobei init ziemlich unpassender name ist, eher was mit create bitte 

  virtual bool identify (int data)=0;
  virtual ~Algo();
};
</code></pre>
<p>deine cpp koennte dann so aussehen ....</p>
<pre><code class="language-cpp">Algo* Algo::init(algoId)
{
  Algo* tret = NULL;
  switch(algoID)
  {
  case 0:
    tret = new YUV(); 
    break;
  case 1:
    tret =  new NCCF(); 
    break;
  case 2:
    tret = new SIFT(); 
    break;
  }
  return tret;
} ;
// und was noch so fuer algo brauchst ... Ctor Dtor
Algo::Algo
{
  // .. 
}
Algo::~Algo
{
  // .. 
}
</code></pre>
<p>Aufruf gaenge dann so:</p>
<pre><code class="language-cpp">Algo::algoID aId = Algo::yuv; // oder was auch immer 
// 
Algo* algo = Algo::init (aId); // statische methode aufrufen ! 
algo-&gt;identify(img);
</code></pre>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993825</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 14 Feb 2006 11:39:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 13:36:21 GMT]]></title><description><![CDATA[<p>ok, ich habe das genauso umgesetzt, allerdings meckert der Compiler:</p>
<p>Cpp:</p>
<pre><code>Algo* Algo::create(algoId)
{
  Algo* al = NULL;
  switch(algoID)
  {
  case 0:
    al = new YUV();
    break;
  case 1:
    al =  new NCCF();
    break;
  case 2:
    al = new SIFT();
    break;
  }
  return al;
} ;
</code></pre>
<p>h.:</p>
<pre><code>int algoId = 1;

class Algo{

public:

   enum{yuv,nccf,sift} algoId; 

  Algo();
  static Algo * create(int algoId);
  virtual bool identify (int data)=0;

  virtual ~Algo();
};
</code></pre>
<p>Der Compiler sagt:</p>
<blockquote>
<p>1. im Cpp: error C2597: illegal reference to non-static member 'Algo::algoId'<br />
2. error C2761: 'Algo *Algo::create(int)' : member function redeclaration not allowed</p>
</blockquote>
<p>Hmmmmmmmmmmmmmmmm ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993933</guid><dc:creator><![CDATA[Alex179]]></dc:creator><pubDate>Tue, 14 Feb 2006 13:36:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 13:46:20 GMT]]></title><description><![CDATA[<p>Du verwendest den Namen &quot;algoID in drei verschiedenen Zusammenhängen (globale Variable, enum-Typ, Methoden-Parameter), das kann nicht gutgehen:</p>
<pre><code class="language-cpp">class Algo
{
public:
  enum{yuv,nccf,sift} algoID;

  Algo* create(algoID id)
  ...
};

Algo* Algo::create(Algo::algoID id)
{
  switch(id)
  {
  case yuv:  return new YUV();
  case nccf: return new NCCF();
  case sift: return new SIFT();
  default:   return NULL;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/993942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993942</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Tue, 14 Feb 2006 13:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 13:57:44 GMT]]></title><description><![CDATA[<p>CStoll (off) schrieb:</p>
<blockquote>
<p>Du verwendest den Namen &quot;algoID in drei verschiedenen Zusammenhängen (globale Variable, enum-Typ, Methoden-Parameter), das kann nicht gutgehen:</p>
<pre><code class="language-cpp">class Algo
{
public:
  enum{yuv,nccf,sift} algoID;

  Algo* create(algoID id)
  ...
};

Algo* Algo::create(Algo::algoID id)
{
  switch(id)
  {
  case yuv:  return new YUV();
  case nccf: return new NCCF();
  case sift: return new SIFT();
  default:   return NULL;
  }
}
</code></pre>
</blockquote>
<p>Jetzt hier unten bei dem case:<br />
benutze ich dann &quot;case yuv:&quot;oder &quot;case 0:&quot; ? Eigentlich definiere ich doch in meinem Enum, dass 0 yuv ist und 1 nccf usw.</p>
<p>Verstehe ich das etwa falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993956</guid><dc:creator><![CDATA[Alex179]]></dc:creator><pubDate>Tue, 14 Feb 2006 13:57:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Faktorisierung Klassen on Tue, 14 Feb 2006 14:01:32 GMT]]></title><description><![CDATA[<p>Und es kommen immernoch Fehler beim Compilieren:</p>
<pre><code>static Algo * create(int algoID id);
</code></pre>
<blockquote>
<p>error C2146: syntax error : missing ',' before identifier 'id'</p>
</blockquote>
<pre><code>Algo* Algo::create(Algo::algoID id)
{
</code></pre>
<blockquote>
<p>error C2039: 'algoID' : is not a member of 'Algo'</p>
</blockquote>
<blockquote>
<p>error C2065: 'algoID' : undeclared identifier</p>
</blockquote>
<blockquote>
<p>error C2146: syntax error : missing ')' before identifier 'id'</p>
</blockquote>
<blockquote>
<p>error C2761: 'Algo *Algo::create(int)' : member function redeclaration not allowed</p>
</blockquote>
<p>Irgendwie komisch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993963</guid><dc:creator><![CDATA[Alex179]]></dc:creator><pubDate>Tue, 14 Feb 2006 14:01:32 GMT</pubDate></item></channel></rss>