Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

1

10.03.2008, 23:05

virtuelle Funktionen nicht in einer Klasse?

hallo alle zusammen,
Ich habe folgendes Problem: Wenn ich von einer Klasse mehrere Vererbungen habe und für jede eine überladene Funktion; wie schaffe ich es, dass mein Programm die "richtige" nimmt. Hier mal ein Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A{
    protected:
     int Zahl;
    public:
     get_Zahl();
}

class B : public A{           //Vererbungen

      int Zahl2;
}                                  // Ich weiss, dass die Klassen wenig sinn machen,

                                   //sie sollen auch nur verdeutlichen auf was ich hinaus will

class C : public A{
      char ch;
}

void get_variablen(C* t_C);  // gibt alle Membervariablen einer Klasse C aus

void get_variablen(B* t_B);  // das gleiche wie oben, nur mit B


soweit so gut. Wenn ich jetzt aber ein Array des typs 'A' mache, damit ich darin sowohl B als auch C speichern kann, gelingt es mir nicht mit dem Aufruf von get_variablen(Array_A[1]) die jeweilige Funktion zu "erwischen"
also so :

C-/C++-Quelltext

1
2
3
4
5
6
A A_Array[5]; // Array von A

   A_Array[0] = C()   //irgendein Konstruktor

   A_Array[1] = B()   // s.o.


get_variablen(&A_Array[0])  // theoretisch "C"-get_variablen aufrufen

get_variablen(&A_Array[1])  // "        "      "B"- " "


jetzt bekomme ich aber den Fehler, dass es die Funktion get_variablen(&A) nicht gibt. (Die brauch ich ja auch gar nicht).

Dazu ist eventuell noch zu sagen, dass Ich, in dem Fall, das Array von A in einer extra Funktion fülle (bzw. in mehreren). Denn ich glaube, dass das obige Beispiel sogar funktionieren würde :shock:

Ich hoffe ihr versteht was ich meine, falls nicht kann ich es noch mehr konkretisieren.

Danke schonmal im voraus :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

10.03.2008, 23:08

Geht nicht.
Ginge auf diese Weise nicht einmal mit virtuellen Methoden ...
(Du musst schon mit Zeigern arbeiten.)

Was soll das denn überhaupt?
Warum nimmst du nicht eine normale virtuelle Methode?

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

3

10.03.2008, 23:19

das ist ein wenig kompliziert^^''. Das Beispiel ist aber auch extrem vereinfacht dargestellt, denn in meinem Code sind/sollten diese Funktionen eine Art Knotenpunkt darstellen, die 2 große Programmteile miteinander verknüpft.
Aber ich schätze ich habe mich so an diese Möglichekit geklammert, dass ich mir keine Gedanken über andere gemacht habe :roll:

Danke für die schnelle Antwort. Meine Frage hat sich damit dann wohl geklärt :)

$nooc

Alter Hase

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

4

11.03.2008, 08:05

naja also ich als anfänger werd da wohl nicht zur lösung des problems verhelfen können, aber ginge das nicht mit einem 2ten internen aufruf einer template funktion oder so?

pseudocode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void get_variablen(A A_Array[])
{
    // [...]


         // in eine for schleife verpacken ....


    getVar(A_Array[0].type());

    // [...]

} // get_variablen()


template<typename T>
getVar(T obj)
{
    // [...]


    get_Zahl();

    // [...]

} //getVar()



bitte haut mich jetzt nicht, ich bin mir sicher dass man das so nicht machen kann, denn sonst hättet ihr ja wohl daran gedacht, aber wieso könnte man das nicht so in etwa machen?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

5

11.03.2008, 13:04

Unter einer Bedingung geht es doch: wenn deine Klassen polymorph sind, also deine Basisklasse (A) auch virtuelle Funktionen enthält.

Dann kannst du mit dynamic_cast<> arbeiten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void get_variablen(A *a)
{
    B *b = dynamic_cast<B*>(a);
    if ( b != NULL )
    {
        // -> get_vaiablen(B *b)

        std::cout << "B mit Zahl1=" << b->get_Zahl() << " und Zahl2=" << b->Zahl2 << std::endl;
    }
    
    C *c = dynamic_cast<C*>(a);
    if ( c != NULL)
    {
        // -> get_variablen(C *c)

        std::cout << "C mit Zahl1=" << c->get_Zahl() << " und ch=" << c->ch << std::endl;
    }
}

Das Array muss dazu aber - wie David ja bereits geschrieben hat - aus Pointern auf Objekte vom Typ A bestehen.

Zitat von »"$nooc"«

aber ginge das nicht mit einem 2ten internen aufruf einer template funktion oder so?
...
aber wieso könnte man das nicht so in etwa machen?

Ein Aufruf eines Funktionstemplates wird bereits zur Compilierzeit durch einen Aufruf einer konkreten (also typspezifischen, anhand des Templates generierten) Funktion ersetzt.
Der Compiler kann aber unmöglich wissen, ob zur Laufzeit ein Pointer auf A tatsächlich auf ein Objekt vom Typ B oder C zeigen wird.

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

6

11.03.2008, 16:50

ok ich hab' eine seeehhr einfache Lösung gefunden:

C-/C++-Quelltext

1
2
3
A* A_Array[5];

get_variablen((B*) A_Array[0])


Ich fass' es selber nicht, dass es klappt, aber meine Bildschirmausgabe beweist das Gegenteil :roll:

jetzt musste ich das natürlcih noch in eine if Abfrage packen, damit er weiß, wann B und wann es C ist, aber ansonsten klappt es :D

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

7

11.03.2008, 17:14

Zitat von »"Chef-Koch"«

Ich fass' es selber nicht, dass es klappt

Tut es auch nicht. Es funktioniert nur, wenn A_Array[0] ein Zeiger auf ein Objekt vom Typ B ist.

Und wenn du jetzt eine Fallunterscheidung auf Grund des Typs zur Laufzeit machen möchtest, landest du unweigerlich wieder beim dynamic_cast<>.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

11.03.2008, 18:31

Zitat von »"Chef-Koch"«

if schleife

Bitte, was? Sag, dass es ein Versehen war. "if schleife" ist so ziemlich das Schlimmste, was man als Programmierer sagen kann.

$nooc

Alter Hase

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

9

11.03.2008, 19:56

wieso?

sind if schleifen und for bedingungen nicht das A und O bei der programmierung?

sind diese klassen in der programmiersprache html nicht besonders wichtig?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Gon

Treue Seele

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

10

11.03.2008, 19:56

Wieso denn?

Werbeanzeige