<?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[Klasse in Konstruktor einer anderen Klasse definieren]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich stelle mich mal kurz vor:<br />
Mein Name ist Stefan, ich habe E-Technik studiert und einiges an Programmierskills schon wieder vergessen <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="😉"
    /> Ich würde mich daher als Anfänger einstufen. Ich kann gut Zusammenhänge zur HW herstellen aber die Syntax und besonders die Programmierpraxis und Erfahrung fehlen mir.<br />
Ach ja, mein Arbeitsplatz ist xcode...<br />
Mein aktuelles Projekt ist ein VST Plugin, in dem ich Laufzeitunterschiede zwischen zwei Audiosignalen ausgleichen will.<br />
Kurzer Abriss zum VST: Es handelt sich um eine von Steinberg(c) entwickelte Umgebung, die es ermöglicht, Instrumente und Effekte für Audio einzubinden. Dazu gibt es eine Host-SW und halt das jeweilige PlugIn. Die Anbindung der Audio Hardware geschieht Host-seitig, daher ist die Entwicklung eines PlugIns vergleichsweise einfach. Die Audiodaten werden beim Aufruf der &quot;Effekt-Funktion&quot; als Pointer auf ein Feld übergeben und direkt bearbeitet = ersetzt.</p>
<p>Okay, das sollte genügen.<br />
Aktuell hänge ich an einer Stelle, die ich mal wie folgt beschreiben möchte.</p>
<p>Beim Laden des PlugIns wird ein Konstruktor aufgerufen, der die Effektklasse &quot;konstruiert&quot;.</p>
<pre><code>ADelay::ADelay (audioMasterCallback audioMaster)
	: AudioEffectX (audioMaster, kNumPrograms, kNumParams)
</code></pre>
<p>Der Callback-Kram muss mich dabei erstmal nicht interessieren.<br />
Dort werden auch die Variablen initialisiert, die im späteren, eigentlichen Effektprozess relevant sind.<br />
Der Prozess lautet</p>
<pre><code>void ADelay::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
</code></pre>
<p>und gehört ebenfalls zur ADelay Klasse. (Findige Leute werden hier feststellen, dass ich das von Steinberg mitgelieferte Beispiel editiere. Hat den Vorteil, dass eine lauffähige Basis vorliegt)<br />
Nun zu meinem Problem:<br />
Ich möchte eine Operation aus der Signalverarbeitung durchführen (Kreuzkorrelation) und den Ergebnisvektor speichern.<br />
Die processReplacing Funktion wird vom Host aufgerufen und editiert ca. 10ms Signal und wird danach wieder verlassen. Das bedeutet, dass ja meine Ergebnisse aus dieser Klasse erstmal weg sind.<br />
Also war meine Idee, zunächst im Konstruktor der ADelay den (noch parameterlosen) Konstruktor meiner Xcorr Klasse aufzurufen:</p>
<pre><code>Xcorr Correlation;
</code></pre>
<p>Nun möchte ich den Ergebnisvektor mittels einer Memberfunktion</p>
<pre><code>int Xcorr::createResultVector(int size)
{
    resultVector = new float[2*size];       // type resultVector = float*
    *resultVector = {0};                    // initialisation
    sizeResultVector=sizeof(resultVector);
    return (sizeResultVector);
}
</code></pre>
<p>erstellen. Das kann ich aber erst in der processReplacing tun, da mir erst dort der Wert von size vorliegt.<br />
Hier mein Problem: Ich kann nicht innerhalb der processReplacing meinen Aufruf tätigen</p>
<pre><code>Correlation.createResultVector(sampleFrames);
</code></pre>
<p>Es heißt <em>use of undeclared identifier &quot;Correlation&quot;</em><br />
Ich gehe mal davon aus, dass es eine einfache Erklärung gibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Besten Dank schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325409/klasse-in-konstruktor-einer-anderen-klasse-definieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 08:19:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325409.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Apr 2014 12:41:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klasse in Konstruktor einer anderen Klasse definieren on Wed, 30 Apr 2014 12:41:20 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich stelle mich mal kurz vor:<br />
Mein Name ist Stefan, ich habe E-Technik studiert und einiges an Programmierskills schon wieder vergessen <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="😉"
    /> Ich würde mich daher als Anfänger einstufen. Ich kann gut Zusammenhänge zur HW herstellen aber die Syntax und besonders die Programmierpraxis und Erfahrung fehlen mir.<br />
Ach ja, mein Arbeitsplatz ist xcode...<br />
Mein aktuelles Projekt ist ein VST Plugin, in dem ich Laufzeitunterschiede zwischen zwei Audiosignalen ausgleichen will.<br />
Kurzer Abriss zum VST: Es handelt sich um eine von Steinberg(c) entwickelte Umgebung, die es ermöglicht, Instrumente und Effekte für Audio einzubinden. Dazu gibt es eine Host-SW und halt das jeweilige PlugIn. Die Anbindung der Audio Hardware geschieht Host-seitig, daher ist die Entwicklung eines PlugIns vergleichsweise einfach. Die Audiodaten werden beim Aufruf der &quot;Effekt-Funktion&quot; als Pointer auf ein Feld übergeben und direkt bearbeitet = ersetzt.</p>
<p>Okay, das sollte genügen.<br />
Aktuell hänge ich an einer Stelle, die ich mal wie folgt beschreiben möchte.</p>
<p>Beim Laden des PlugIns wird ein Konstruktor aufgerufen, der die Effektklasse &quot;konstruiert&quot;.</p>
<pre><code>ADelay::ADelay (audioMasterCallback audioMaster)
	: AudioEffectX (audioMaster, kNumPrograms, kNumParams)
</code></pre>
<p>Der Callback-Kram muss mich dabei erstmal nicht interessieren.<br />
Dort werden auch die Variablen initialisiert, die im späteren, eigentlichen Effektprozess relevant sind.<br />
Der Prozess lautet</p>
<pre><code>void ADelay::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
</code></pre>
<p>und gehört ebenfalls zur ADelay Klasse. (Findige Leute werden hier feststellen, dass ich das von Steinberg mitgelieferte Beispiel editiere. Hat den Vorteil, dass eine lauffähige Basis vorliegt)<br />
Nun zu meinem Problem:<br />
Ich möchte eine Operation aus der Signalverarbeitung durchführen (Kreuzkorrelation) und den Ergebnisvektor speichern.<br />
Die processReplacing Funktion wird vom Host aufgerufen und editiert ca. 10ms Signal und wird danach wieder verlassen. Das bedeutet, dass ja meine Ergebnisse aus dieser Klasse erstmal weg sind.<br />
Also war meine Idee, zunächst im Konstruktor der ADelay den (noch parameterlosen) Konstruktor meiner Xcorr Klasse aufzurufen:</p>
<pre><code>Xcorr Correlation;
</code></pre>
<p>Nun möchte ich den Ergebnisvektor mittels einer Memberfunktion</p>
<pre><code>int Xcorr::createResultVector(int size)
{
    resultVector = new float[2*size];       // type resultVector = float*
    *resultVector = {0};                    // initialisation
    sizeResultVector=sizeof(resultVector);
    return (sizeResultVector);
}
</code></pre>
<p>erstellen. Das kann ich aber erst in der processReplacing tun, da mir erst dort der Wert von size vorliegt.<br />
Hier mein Problem: Ich kann nicht innerhalb der processReplacing meinen Aufruf tätigen</p>
<pre><code>Correlation.createResultVector(sampleFrames);
</code></pre>
<p>Es heißt <em>use of undeclared identifier &quot;Correlation&quot;</em><br />
Ich gehe mal davon aus, dass es eine einfache Erklärung gibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Besten Dank schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396858</guid><dc:creator><![CDATA[Stefatronik]]></dc:creator><pubDate>Wed, 30 Apr 2014 12:41:20 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Konstruktor einer anderen Klasse definieren on Thu, 01 May 2014 08:29:21 GMT]]></title><description><![CDATA[<p>β</p>
<p>Stefatronik schrieb:</p>
<blockquote>
<p>Ich gehe mal davon aus, dass es eine einfache Erklärung gibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Besten Dank schonmal</p>
</blockquote>
<p>Ich habe mir das gerade mal angeschaut: warum sprichst Du denn eigentlich noch von ADelay? Die Klasse müsstest Du doch komplett implementieren für Dein Vorhaben?!</p>
<p>Wie Du allerdings dann Daten aus dem Plugin bekommst, und ob das überhaupt geht: keine Ahnung.</p>
<p>Aber prinzipiell koennte das irgendwie so aussehen:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iterator&gt;
#include &lt;utility&gt;
#include &lt;vector&gt;

struct xcorr : public AudioEffectX{
	// blablabla
	void processReplacing (float**, float**, VstInt32);	
private:
	float compute(float, float) const; // Funktion z. Kreuzkorrelation...
	std::vector&lt;float&gt; result;   // ...und deren Ergebnisse
};

void xcorr::processReplacing (float** inputs, float** outputs, VstInt32 n)
{
	using namespace std;
	const float* first0 = inputs[0], *last0=inputs[0]+n;
	const float* first1 = inputs[1], *last1=inputs[1]+n;

	// f() ist this-&gt;compute()
	const auto&amp; f = bind(&amp;xcorr::compute, this);
	// Kreuzkorrelation berechnen und in result speichern
	transform(first0, last0, first1, back_inserter(result), f);

	//durchschleifen:
	copy(first0, last0, outputs[0]);
	copy(first1, last1, outputs[1]);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2396946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396946</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 01 May 2014 08:29:21 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Konstruktor einer anderen Klasse definieren on Tue, 06 May 2014 13:39:09 GMT]]></title><description><![CDATA[<p>Hi<br />
danke für deinen Beitrag, den ich leider erst heute gesehen habe.</p>
<blockquote>
<p>warum sprichst Du denn eigentlich noch von ADelay?</p>
</blockquote>
<p>Weil ich diese funktionierende Klasse erstmal nur anpassen möchte. Die Delay Funktion, die ich später nutzen möchte, ist ja bereits vorhanden und funktioniert.<br />
wenn ich dein Beispiel richtig verstehe, dann befinden sich alle Funktionen für die Kreuzkorrelation als Memberfunktionen innerhalb der Effektklasse (bei mir ADelay, bei dir xcorr). Ich wollte versuchen, die Kreuzkorrelation als eigene Klasse zu definieren, damit ich diese später leichter exportieren und in ein anderes Projekt einfügen kann.<br />
Ist diese Art der Aufteilung überhaupt möglich und macht die Vorgehensweise Sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397677</guid><dc:creator><![CDATA[Stefatronik]]></dc:creator><pubDate>Tue, 06 May 2014 13:39:09 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Konstruktor einer anderen Klasse definieren on Tue, 06 May 2014 14:38:38 GMT]]></title><description><![CDATA[<p>Stefatronik schrieb:</p>
<blockquote>
<p>wenn ich dein Beispiel richtig verstehe, dann befinden sich alle Funktionen für die Kreuzkorrelation als Memberfunktionen innerhalb der Effektklasse (bei mir ADelay, bei dir xcorr).</p>
</blockquote>
<p>Ich weiss ja nichteinmal, was eine Kreuzkorrelation ist - das Beispiel soll nur zeigen, wie Du in <code>processReplacing()</code> mit C++ sehr einfach eine unbekannte Menge von Daten speichern kannst. Und insbesondere, dass die manuelle Speicherverwaltung, die Du ansatzweise gepostet hast (Dein <code>Xcorr::createResultVector()</code> ) völlig in die Irre führt.<br />
Sieh meine Version von <code>processReplacing()</code> als subtilen Hinweis, dass Du Dich mit der C++-Standardbibliothek vertraut machen sollst! <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>Stefatronik schrieb:</p>
<blockquote>
<p>Ich wollte versuchen, die Kreuzkorrelation als eigene Klasse zu definieren, damit ich diese später leichter exportieren und in ein anderes Projekt einfügen kann.<br />
Ist diese Art der Aufteilung überhaupt möglich und macht die Vorgehensweise Sinn?</p>
</blockquote>
<p>Klar, wenn zur Kreuzkorrelation mehr gehört als eine simple Funktion, die zwei <code>floats</code> nimmt und einen wieder ausspuckt, ist das lohnend.<br />
Ohne viel Schnickschnack hat das Plugin dann beispielsweise ein Xcorr member:</p>
<pre><code class="language-cpp">// Deine Klasse zur Kreuzkorr.
struct Xcorr{
    // bla bla bla
};

struct stefatronik_plugin : public AudioEffectX{
  // bla bla
  void xcorr::processReplacing (float** inputs, float** outputs, VstInt32 n)
  {
    //... mach was mit inputs, outputs und xc_;
  }
private:
  Xcorr xc_; // hier ist sie wieder, die Kreuzkorr.
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2397693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397693</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 06 May 2014 14:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Konstruktor einer anderen Klasse definieren on Tue, 06 May 2014 14:55:57 GMT]]></title><description><![CDATA[<p>Vielleicht sollte das Problem anders formulieren.<br />
Bitte zieht auch in Betracht, dass ich möglicherweise einen sehr grundlegenden Anfängerfehler mache, wie gesagt, Programmiererfahrung = wenig ^^</p>
<p>Ich möchte im Konstruktor der Klasse &quot;A&quot; eine Instanz einer Klasse &quot;kl&quot; vom Typ &quot;B&quot; öffnen.<br />
Nun möchte ich im weiteren Verlauf aus einer Memberfunktion von &quot;A&quot; eine Memberfunktion aus &quot;kl&quot; aufrufen.<br />
Wie muss also dieser Aufruf aussehen?<br />
Ich hoffe, das war anschaulicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397696</guid><dc:creator><![CDATA[Stefatronik]]></dc:creator><pubDate>Tue, 06 May 2014 14:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Konstruktor einer anderen Klasse definieren on Tue, 06 May 2014 15:15:59 GMT]]></title><description><![CDATA[<p>Stefatronik schrieb:</p>
<blockquote>
<p>Ich möchte im Konstruktor der Klasse &quot;A&quot; eine Instanz einer Klasse &quot;kl&quot; vom Typ &quot;B&quot; öffnen.</p>
</blockquote>
<p>Was bedeutet &quot;öffnen&quot; in diesem Zusammenhang?<br />
So?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

struct B{
  B(const std::string&amp; s)
    : s_(s)
  {
  }
  void hello() const
  {
    std::cout &lt;&lt; s_ &lt;&lt; '\n';
  }
private:
  std::string s_;
};

struct A{
  A()
    : kl(&quot;Hello World&quot;)
  {
  }
  void func() const
  {
    kl.hello();
  }
private:
  B kl;
};

int main(){
  A a;
  a.func();
}
</code></pre>
<p>Ich empfehle Dir ein C++ Buch - das sind Grundlagen. Und ein Forum ist IMHO nicht der richtige Ort um Grundlagen zu lernen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397699</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 06 May 2014 15:15:59 GMT</pubDate></item></channel></rss>