# [C++] Objekt Pointer zuweisen und Methoden auf Pointer realisieren?



## Ezzz (31. Oktober 2003)

Hallo,
noch eine wahrscheinlich selten dämliche Frage, aber ich kriegs leider auch nach diversen Versuchen nicht hin:

Ich habe zwei Klassen (ich nenne sie mal Klasse 1 und Klasse 2  ), die "nach aussen" die gleiche Funktionalität und die gleich benannten Methoden haben. Nur in den Klassen selbst gibt es unterschiede in der Realisation der Methoden, speziell der Datenstrukturen.
Ich habe eine Klasse, die nun zur Laufzeit wählen soll, ob sie ein Objekt der Klasse 1 oder ein Objekt der Klasse 2 anlegen soll. Das Objekt soll jedoch nicht mit new auf dem Heap angelegt werden und es soll für alle Methoden der Klasse sichtbar sein. Im Idealfall sollte eine weitere Klasse, die das Objekt der aufrufenden Klasse erstellt, auch darauf zugreifen können.
... puh ... wahrscheinlich liest so viel Text kein Mensch.. 

Also kurz die Zugriffe:

KlasseA erstellt Objekt KlasseB erstellt Objekt Klasse1 oder Klasse2
KlasseA greift zu auf: Klasse B und Klasse1 oder Klasse2
Klasse B greift auf Klasse1 oder Klasse2 zu.

Meine Idee war, in der header-Datei von Klasse B Objekt von Klasse1 und Klasse2 zu erzeugen und anschliessend einen Pointer entweder auf Objekt1 oder auf Objekt2 zu setzen. Dann kann ich aber leider die Methoden der Objekte mit dem Pointer nicht nutzen (Fehlermeldung: *Klasse1|2 muss eine Struktur/Unionen/Klasse sein...)

Vielleicht hat jemand eine bessere Idee bzw. weiss die korrekte Vorgehensweise.

Schon mal vielen Dank,
Grüße,
Ezzz


----------



## chibisuke (31. Oktober 2003)

Du hast n fehler im aufbau deiner klassenstruktur,,, ich geb dir mal n beispiel wie mans richtig macht ;-)

```
class baseClass {
  public:  
    baseClass();
    ~baseClass();
    virtual void methode1() = 0;
    virtual char* methode2() = 0;
    virtual int methode3() = 0;
};

class a :public baseClass {
  public:
    a();
    ~a();
    void methode1();
    char* methode2();
    int mehtode3();
  private:
    //was auch immer
};

class b :public baseClass {
  public:
    b();
    ~b();
    void methode1();
    char* methode2();
    int mehtode3();
};
```

so gehöhrt es richtig.. du brauchst eine basisklasse von der du ableiten kannst, sonst gibts beim typecast probleme...

so und nun hast du irgendwo eine variable vom typ
baseClass* 

auf die kannst du mit einem cast sowohl klasse a als auch klasse b drauf casten...

kleines beispiel:


```
baseClass* myObject;
    bool useClassA = false;
    useClassA = getUserResponse("want a instance of class A?");
    if(useClassA) {
        myObject = (baseClass*) new A();
    } else {
        myObject = (baseClass*) new B();
    }
    myObject->methode1();
    char* blabla = myObject->methode2();
```

beachte.. wenn du einen pointer auf ein objekt hast, dann musst du -> anstat dem . einsetzen...


----------



## Ezzz (1. November 2003)

Vielen Dank!

Das klingt sehr logisch. Wie man sieht, bin ich auf dem Gebiet der Objektorientierung noch nicht sehr weit 

Ich werde das jetzt mal versuchen so umzusetzen. Hab gestern Nacht noch ein Tutorial gefunden, das diese virtuellen Methoden genauer beschreibt.

Nochmal Danke,
Grüße,
Ezzz


----------



## chibisuke (1. November 2003)

Jaja objektorientirung hatt viel mit Logik zu tun, aber war auch für mich ein harter brocken bis ich es volständig beherscht hatte, und die ansätze davon zu schätzen gelernt hab...

prinziell zu den virtuellen methoden:

auch virtuelle methoden müssen eine implementation aufweise, außer sie werden als rein virtuell definiert, ( das = 0 ) dann dürfen sie keine implementation aufweisen,
von klasen die eine rein virtuelle methode enthalten kann KEINE instanz gebildet werden...
zu beachten ist außerdem, das nur Virtuelle methode später überladen werden können...

Auchso ja, außerdem solltest du hier schon NEW benutzen, denn mit new ist es möglich das du direkt einen pointer bekommst, den du auch richtig casten kannst...das system mit den pointern, wie ich es gezeigt hab, ist ja eigendlich sinn und zwar von Objektorientierung.


----------



## basd (2. November 2003)

> ...das system mit den pointern, wie ich es gezeigt hab, ist ja eigendlich sinn und zwar von Objektorientierung.



naja Pointer haben nix mit objektorientierung zu tun ! 
Java ist Objektorientiert und hat keine Pointer  
aber in C++ sollten man jedoch , wie richtig gesagt, mit new und pointern arbeiten
(klug)


----------



## chibisuke (2. November 2003)

basd hat gesagt.:
			
		

> naja Pointer haben nix mit objektorientierung zu tun !
> Java ist Objektorientiert und hat keine Pointer



Das stimmt nicht ganz, genau genommen arbeitet Java nämlich mit nichts anderem als pointer und primitiven typen, nur ist java so aufgebaut das es bei jedem zugriff den pointer automatisch auflöst wenn es notwendig ist, so das der programmierer davon nichts mehr mitbekommt..
Na gut wenn dus ganz genau nimmst muss ich sagen es sind Referenzen..


----------



## basd (2. November 2003)

wir schweifen vom Thema ab  , klar ist es intern mit Pointer gelöst , da die Hardware auf Assemblereben ebenfalls über "Pointer" arbeitet.

Aber Referenzierung klingt gut 

(noch mehr klug)


----------

