<?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[array vererben?]]></title><description><![CDATA[<p>Hi, ich habe die ganze Nacht an folgender Problematik gesessen:</p>
<p>Hier eine vereinfachte Darstellung:</p>
<pre><code># define NUM_OBJ 10

class A {
    int i
}

class B : public A {
    int j;
}

function main() {

    B objects[NUM_OBJ];

    //objects mit Werten gefüllt vorstellen

    test(objects);

}

function test(A* objects) {

    for(int i=0; i&lt;NUM_OBJ; i++)

        objects[i].i;

}
</code></pre>
<p>Das Problem ist, dass objects[i]-&gt;i; meistens Falsche Werte hat.</p>
<p>(In Wirklichkeit arbeite ich mit komplexeren Datentypen als int, daher könnte das Beispiel möglicherweise sogar korrekt sein)</p>
<p>Was mache ich falsch?</p>
<p>Ps: verzeiht bitte die Threadbezeichnung, ich weiß nicht, wie ich das Problem benennen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243951/array-vererben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 15:29:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243951.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Jun 2009 11:20:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 11:24:25 GMT]]></title><description><![CDATA[<p>Hi, ich habe die ganze Nacht an folgender Problematik gesessen:</p>
<p>Hier eine vereinfachte Darstellung:</p>
<pre><code># define NUM_OBJ 10

class A {
    int i
}

class B : public A {
    int j;
}

function main() {

    B objects[NUM_OBJ];

    //objects mit Werten gefüllt vorstellen

    test(objects);

}

function test(A* objects) {

    for(int i=0; i&lt;NUM_OBJ; i++)

        objects[i].i;

}
</code></pre>
<p>Das Problem ist, dass objects[i]-&gt;i; meistens Falsche Werte hat.</p>
<p>(In Wirklichkeit arbeite ich mit komplexeren Datentypen als int, daher könnte das Beispiel möglicherweise sogar korrekt sein)</p>
<p>Was mache ich falsch?</p>
<p>Ps: verzeiht bitte die Threadbezeichnung, ich weiß nicht, wie ich das Problem benennen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731534</guid><dc:creator><![CDATA[pewpy]]></dc:creator><pubDate>Tue, 23 Jun 2009 11:24:25 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 11:28:01 GMT]]></title><description><![CDATA[<p>Du darfst ein Array von <code>B</code> -Objekten nicht als Array von <code>A</code> -Objekten interpretieren. Das tust du aber, indem du einen Zeiger auf <code>B</code> bei der Übergabe an <code>test()</code> implizit in einen Zeiger auf <code>A</code> umwandelst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731537</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Jun 2009 11:28:01 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 11:32:07 GMT]]></title><description><![CDATA[<p>Ja, das entspricht meinem Vorhaben <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>Ich nehme also an, dass das unmöglich ist?</p>
<p>Der Compiler erlaubt es zumindest, aber die Ergbnisse sind nicht korrekt.</p>
<p>Gibt es eine Möglichkeit, das zu lösen?</p>
<p>Ich möchte eine Funktion erstellen, die Arrays von A und B Objekten durchlaufen kann. Sie muss auch nur die A-spezifischen Eigenschaften kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731541</guid><dc:creator><![CDATA[pewpy]]></dc:creator><pubDate>Tue, 23 Jun 2009 11:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 12:04:29 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich glaube, die Lösung gefunden zu haben!</p>
<pre><code># define NUM_OBJ 10

class A {
    int i
}

class B : public A {
    int j;
}

function main() {

    B objects[NUM_OBJ];

    //objects mit Werten gefüllt vorstellen

    test(objects, [b]sizeof(B)[/b]);

}

function test(A* objects, int size) {

    int offset = size / [b]sizeof(A*)[/b];
    int j=0;

    for(int i=0; i&lt;NUM_OBJ; i++) {

        objects[j].i;
        [b]j += offset;[/b]

    }

}
</code></pre>
<p>So funktioniert es auf jeden Fall sehr gut, sogar wenn ich die Klassen verändere.</p>
<p>Wenn ihr mir sagen könntet, ob mein obiger Versuch zulässig und vor allem sinvoll ist, wäre ich euch sehr verbunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731550</guid><dc:creator><![CDATA[pewpy]]></dc:creator><pubDate>Tue, 23 Jun 2009 12:04:29 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 12:08:57 GMT]]></title><description><![CDATA[<p><em>Antwort an deinen letzten Post angepasst.</em></p>
<p>So, wie du es am Anfang gelöst hast, funktioniert es nicht, weil die Grösse von <code>A</code> und <code>B</code> unterschiedlich sind und du sozusagen &quot;zwischen die Objekte&quot; zugreifst, wenn du per Index zugreifst. Der Offset berechnet sich aus der Grösse von <code>A</code> , in der Tat sind die Elemente aber vom Typ <code>B</code> .</p>
<p>Das mit dem Offset ist eine Möglichkeit, oder du verwendest Zeiger zur Speicherung. Ich hoffe nur, das bei dem Offset ist eine Subtraktion und keine Division... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1731554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731554</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Jun 2009 12:08:57 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 12:05:40 GMT]]></title><description><![CDATA[<p>1. Ich hoffe, dass du keine defines als Konstanten verwendest.<br />
2. <code>function</code> vor der Funktion? Javascript? <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="🙂"
    /><br />
3. Zum eigentlichen Problem:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;

// ...

void test(A* object);

// ...

B objects[NUM_OBJ];

std::for_each(objects, objects + NUM_OBJ, &amp;test);

// ...

void test(A* object)
{
  // mach was mit diesem einzelnen Objekt.
}
</code></pre>
<p>Gäbe auch noch andere Möglichkeiten, aber diese erschien mir am nächsten zu dem, was du machen möchtest.</p>
<p>Zu deinem Versuch (in der Vorschau gesehen):<br />
Das ist simpel und einfach undefiniertes Verhalten. Würde ich auf jedenfalls vermeiden, da gibt es viele bessere Möglichkeiten. <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731555</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 23 Jun 2009 12:05:40 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 12:25:36 GMT]]></title><description><![CDATA[<blockquote>
<p>1. Ich hoffe, dass du keine defines als Konstanten verwendest.</p>
</blockquote>
<p>Nein, das war einfach (extremer) pseudo code.</p>
<p>(edit: obwohl, manchmal schon... habe ich so aus dem buch Spieleprogrammierung mit directx und c++... nicht gut?)</p>
<p>Wie ich auf das &quot;function&quot; kam, weiß ich auch nicht. Wahrscheinlich zu viel PHP oder Javascript programmiert <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>Dein code sieht auf jeden Fall gut aus, werde es gleich mal so probieren.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a></p>
<p>Meine Berechnung des Offsets war mehr oder weniger trail und error.</p>
<p>Ich habe gesehen, dass Objekt B die Größe 28 hat und bei jedem 7. Index den richtigen Wert angab. Daher habe ich geschlussfolgert size = 28 / 4;</p>
<p>Wie wäre der Offset denn richtig zu berechnen? Was wäre zu subtrahieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731575</guid><dc:creator><![CDATA[pewpy]]></dc:creator><pubDate>Tue, 23 Jun 2009 12:25:36 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 12:25:14 GMT]]></title><description><![CDATA[<p>einfach noch einen zeiger verwenden</p>
<pre><code class="language-cpp">class A 
{
    int i;
};

class B : public A
{
    int j;
};

int main()
{
    const unsigned size = 100;

    B objects[size];

    A *pobjects[size];

    for (unsigned i = 0; i &lt; size; ++i)
        pobjects[i] = &amp;objects[i];

    test(pobjects, size);

}

void test(A* objects, unsigned num)
{
    for (unsigned i=0; i &lt; num; ++i)
        objects[j]-&gt;i = i;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1731577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731577</guid><dc:creator><![CDATA[tippgeber]]></dc:creator><pubDate>Tue, 23 Jun 2009 12:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 12:35:14 GMT]]></title><description><![CDATA[<p>pewpy schrieb:</p>
<blockquote>
<pre><code># define NUM_OBJ 10

class A {
    int i
}

class B : public A {
    int j;
}

function main() {
    B objects[NUM_OBJ];
    //objects mit Werten gefüllt vorstellen
    test(objects);
}

function test(A* objects) {
    for(int i=0; i&lt;NUM_OBJ; i++)
        objects[i].i;
}
</code></pre>
</blockquote>
<p>Das kompiliert ja gar nicht (Funktionen definiert man anders, Semikolons fehlen).</p>
<p>Du solltest statt mit <code>#define</code> die Konstante so definieren:</p>
<pre><code class="language-cpp">const int num_of_objects = 10;
</code></pre>
<p>Denn Makros sind &quot;böse&quot;.</p>
<p>Das Problem bei Dir ist, dass Du Vererbung mit Zeigerarithmetik vermischt. Das ist, wie Du festgestellt hast, fatal. Anderes Beispiel:</p>
<pre><code class="language-cpp">void foo() {
    B barr[2];
    A* p0 = &amp;barr[0];
    A* p1 = &amp;barr[1];
    assert( p0+1==p1 ); // ...ist aber falsch
  }
</code></pre>
<p>In &quot;barr&quot; stehen die 2 Objekte direkt hintereinander. Ein B-Objekt ist aber größer als ein A-Objekt. <code>p0+1</code> zeigt deswegen nicht auf das A-Subobjekt von <code>barr[1]</code> .</p>
<p>Versuch einfach, es irgendwie anders zu machen, also ein anderes Design zu wählen.</p>
<p>Wenn Du bei dem Design unbedingt bleiben willst, kannst Du Dir eine kleine Headerdatei anlegen, sie mit etwas &quot;schwarzer Magie&quot; füllen und dann so benutzen:</p>
<pre><code class="language-cpp">//------------------------------------------
  // Schwarze Bibliotheks-Magie (Header file)
  //------------------------------------------

  #include &lt;cstddef&gt;
  #include &lt;stdexcept&gt;

  template&lt;typename T&gt;
  class range_ref {
  protected:
    ~range_ref() {}
  public:
    virtual std::size_t size() const = 0;
    virtual T&amp; operator[](std::ptrdiff_t index) const = 0;
  };

  template&lt;typename As, typename From&gt;
  class range_ref_array_impl : public range_ref&lt;As&gt; {
    From* base_;
    std::size_t size_;
  public:
    range_ref_array_impl(From* ptr, std::size_t size)
      : base_(ptr), size_(size) {}

    template&lt;std::size_t Size&gt;
    range_ref_array_impl(From (&amp;arr)[Size])
      : base_(arr), size_(Size) {}

    std::size_t size() const {return size_;}

    As&amp; operator[](std::ptrdiff_t index) const {
      if (index&lt;0 || index&gt;=size_)
        throw std::out_of_range(&quot;range_ref_array_impl&lt;&gt;: &quot;
                                &quot;out of range error&quot;);
      return base_[index];
    }
  };

  template&lt;typename As, typename From&gt;
  inline range_ref_array_impl&lt;As,From&gt; make_array_ref(
      From* ptr, int size)
  {
    return range_ref_array_impl&lt;As,From&gt;(ptr,size);
  }

  template&lt;typename As, typename From, std::size_t Size&gt;
  inline range_ref_array_impl&lt;As,From&gt; make_array_ref(
      From (&amp;arr)[Size])
  {
    return range_ref_array_impl&lt;As,From&gt;(arr);
  }

  //----------------------
  // Anwendung (cpp file)
  //----------------------

  #include &lt;iostream&gt;

  struct A {int i;};
  struct B : A {int j;};

  void double_Ai(range_ref&lt;A&gt; const&amp; array)
  {
    for (int k=0; k&lt;array.size(); ++k) {
      array[k].i *= 2;
    }
  }

  int main() {
    const int count = 3;
    B array[count];
    for (int k=0; k&lt;count; ++k)
      array[k].i = k;

    double_Ai(make_array_ref&lt;A&gt;(array));

    for (int k=0; k&lt;count; ++k)
      std::cout &lt;&lt; array[k].i &lt;&lt; '\n';
  }
</code></pre>
<p>Die Schnittstelle range_ref&lt;T&gt; ist so allgemein, dass Du im Prinzip auch der &quot;double_Ai&quot; Funktion irgendwelche STL Kontainer unterjubeln kannst -- Hauptsache &quot;random access&quot;.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731583</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 23 Jun 2009 12:35:14 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 12:55:54 GMT]]></title><description><![CDATA[<p>Bietet es sich hier nicht an, die Funktion test einfach als template zu schreiben:</p>
<p>template&lt;class T&gt;<br />
void test(T* objects) {</p>
<p>for(int i=0; i&lt;NUM_OBJ; i++)<br />
objects[i].i;<br />
}</p>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731589</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 23 Jun 2009 12:55:54 GMT</pubDate></item><item><title><![CDATA[Reply to array vererben? on Tue, 23 Jun 2009 13:55:19 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Bietet es sich hier nicht an, die Funktion test einfach als template zu schreiben:</p>
<p>template&lt;class T&gt;<br />
void test(T* objects) {</p>
<p>for(int i=0; i&lt;NUM_OBJ; i++)<br />
objects[i].i;<br />
}</p>
<p>?</p>
</blockquote>
<p>Gibt bei mir den Fehler 'i': Ist kein Element von 'B' aus.</p>
<p>Die Umsetzung von tippgeber klappt sehr gut, ich versuche nur gerade, die erstellung des zweiten zeigers irgendwie zu vereinfachen. Leider geht es nicht, wenn ich den Zeiger erst in der &quot;test&quot; funktion erstelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731611</guid><dc:creator><![CDATA[pewpy]]></dc:creator><pubDate>Tue, 23 Jun 2009 13:55:19 GMT</pubDate></item></channel></rss>