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

$nooc

Alter Hase

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

11

11.03.2008, 19:59

@ Gon: ist dein avatar eine ente?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

12

11.03.2008, 20:54

:? ja ok, ich gesteh mein Fehler ein -.-''

if-Abfrage!

...Aber es klappt trotzdem^^

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

13

11.03.2008, 22:45

Zitat von »"Chef-Koch"«

...Aber es klappt trotzdem^^

Dann weise A_Array[0] doch mal einen Pointer auf ein Objekt vom Typ C zu, dann wirst du schon sehen, ob "es klappt" :roll:

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

14

12.03.2008, 01:01

Ich kann natürlich nicht garantieren, dass mein Beispiel exakt das wiederspiegelt, was ich in meinem Code stehen habe, aber solange es macht was es soll bin ich zufrieden ;)

15

12.03.2008, 12:55

Hier mal ein Vorschlag, welcher nicht so gruselig ist, wie dein unkontrolliertes "gecaste" (Achtung: 86 Zeilen, aber voll funktionsfähig):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>

class BaseOfAll
{
public:
    virtual void display_member() const = 0;
};

// Abgeleitete Klasse A

class DerivedA : public BaseOfAll
{
private:
    // Attribute

    int value_;

public:
    DerivedA(int value=0)
        : value_(value)
        { }

    // Realisierung des Interfaces

    void display_member() const
        {
            std::cout << "value_ = " << value_ << std::endl;
        }
};

// Abgeleitete Klasse B

class DerivedB : public BaseOfAll
{
private:
    // Attribute

    char c_;

public:
    DerivedB(char c=' ')
        : c_(c)
        { }

    // Realisierung des Interfaces

    void display_member() const
        {
            std::cout << "c_ = " << c_ << std::endl;
        }
};

// Abgeleitete Klasse C->A

class DerivedC_A : public DerivedA
{
private:
    // Attribute

    float x_;

public:
    DerivedC_A(float x=0.0, int value=0)
        : DerivedA(value), x_(x)
        { }

    // Redefinition der Methode display_member

    void display_member() const
        {
            DerivedA::display_member();
            std::cout << "x_ = " << x_ << std::endl;
        }
};

// Das Ganze ausgeführt:

int main()
    {
        size_t const N = 3;
        DerivedA objA(123);
        DerivedB objB('X');
        DerivedC_A objCA(1.1, 321);

        BaseOfAll* all[N];
        all[0] = &objA;
        all[1] = &objB;
        all[2] = &objCA;
        for(size_t n = 0; n < N; ++n) {
            std::cout << "[Objekt Nr. " << n << "]" << std::endl;
            all[n]->display_member();
        }

        return EXIT_SUCCESS;
    }


Das "wahlweise" aussuchen einer (seperaten) Funktion anhand des Objekttypes funktioniert schon deshalb nicht, da zur Compile-Zeit feststehen muss, welche Funktion aufgerufen werden soll. Anders bei (virtuellen) Methoden. Hier wird ein Methodenzeiger mitgeführt, der für den Aufruf der richtigen (zur Laufzeit) Methode sorgt.
(Aus dem Kopf ohne Garantie auf Richtigkeit)

Grüße... Heiko

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

16

12.03.2008, 13:33

aber das hier müsste doch auch gehen :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
enum cl{B,C};
class A{
    protected:
     int Zahl;
     cl;
    public:
     get_Zahl();
};

class B : public A{           //Vererbungen

       int Zahl2;
     public:
     B(){ cl = B; }
};                                 // Ich weiss, dass die Klassen wenig sinn machen,

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

class C : public A{
      char ch;
    public:
     C(){cl = C;}
};

und dann mit:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
A* A_Array[5]; // Array von A

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

    A_Array[1] = new B() 

for(int i = 0; i <=1 ; i++)
   if(A_Array[i]->cl == C)
    get_variablen((C*) A_Array[i]);

   else
    get_variablen((B*) A_Array[i]);


und unkontrolliert ist des ja so auch ned , vllt. nicht gerade sicher... Aber so nimmt er auch immer das "richtige" :)

und noch @bwbg: Ich will es ja gerade nicht in meinen Klassen haben, deshalb benutze ich ja diesen Weg anstatt es einfach mit Klassenfunktionen zu lösen. :)

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

17

12.03.2008, 13:59

Jetzt kann ich dir endgültig nicht mehr folgen.

Eine virtuelle Methode - die eindeutig sauberste Lösung ! - scheidet aus irgendwelchen nicht näher benannten Gründen aus.

Es scheint aber allgemein kein Problem zu sein, die Klassen zu verändern, wie z.B. eine weitere Membervariable hinzuzufügen und sämtliche Konstruktoren der erbenden Klassen anpassen zu müssen. Mit allen Konsequenzen, die das für Erweiterbarkeit usw. hat.
Und das nur, um die Funktionalität von dynamic_cast nachzubilden ?!

18

12.03.2008, 14:01

Im Grunde verpasst du deiner Klasse nichts weiteres, als ein Typ-Attribut, welches dann vor dem type-casting abgefragt wird. Dieses setzt natürlich voraus, dass alle Klassen (wie bereits geschehen) von einer gemeinsamen Basisklasse erben.

Letzteres bietet doch schon die idealen Voraussetzungen für den Einsatz der Polymorphie und damit virtuellen Methoden - damit die ersparnis der Typkonvertierungen.

Da stellt sich die Frage, warum du überhaupt die Variablen "von außerhalb der Klasse" auflisten willst.

Grüße... Heiko

Werbeanzeige