1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

c++ objektorientiert

  • martmike
  • 4. April 2007 um 01:08
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • martmike
    Punkte
    50
    Beiträge
    8
    • 4. April 2007 um 01:08
    • #1

    hallo!

    muss man bei der erzeugung von objekten irgendetwas spezielles beachten im gegensatz zu java?

    bei java schreibt man eine klasse. da gibt es nun statische und nicht statische methoden und alles funktioniert fein bei der erzeugung von objekten.

    in c++ bekomme ich immer eine null-reference exception.


    ich habe nun den ganzen Code in eine andere Klasse kopiert und dann geht das mit 2 Objekten. nur ist das nicht sinn und zweck.

    was muss ich tun damit das funktioniert? irgendein spezieller aufruf oder eine deklaration, dass die variablen und methoden sowie in java nicht-statisch, also zu jeder instanz gehörend sind und nicht gemeinsam verwendet oder nur einmal deklarierbar sind?

  • ThomasW
    Punkte
    141
    Beiträge
    28
    • 4. April 2007 um 02:33
    • #2

    Bei C++ sind nur Methoden, die mit dem Keyword 'virtual' deklariert wurden polymorph. Sonst werden sie einfach nur überdeckt.

    Ausserdem kannst Du Polymorphie nur mit Zeigern verwenden.

    Code
    class A
    {
    public:
        virtual void foo() 
        {
            cout << "A" << endl;
        };
    };
    
    
    class B : public A
    {
    public:
        virtual void foo()
        {
            cout << "B" << endl;
        };
    };
    
    
    int main ()
    {
        A a;
        B b;
        A a2 = b;
    
    
        A* pb;
        pb = &b;
    
    
        a.foo();
        b.foo();
        a2.foo();
    
    
        pb->foo();
    
    
        return 0;
    };
    Alles anzeigen

    Dieses Programm hätte den Output

    Code
    A
    B
    A
    B

    Das liegt daran, dass bei Nicht-Zeigern keine Polymorphie benutzt wird. Ausserdem wird b bei der Zuweisung auf a2 auf die Größe von A "zurechtgestutzt". Das kann oft ins Auge gehen. Daher solltest Du darauf Acht geben.

  • hal
    Punkte
    11.122
    Beiträge
    2.208
    • 4. April 2007 um 02:34
    • #3

    Nein, eigentlich muss man nix extra machen, das hat Java von C++ kopiert. Wie instanzierst du denn die Objekte?

  • Swoncen
    Punkte
    5.331
    Beiträge
    993
    • 4. April 2007 um 10:46
    • #4

    Bei C++ gibts auch keinen gc, also

    x = new X();
    delete x; // nicht vergessen

  • martmike
    Punkte
    50
    Beiträge
    8
    • 4. April 2007 um 14:11
    • #5

    hey, ich dank euch burschen.

    mein problem war, ich hatte nicht die Instanzierung mit
    Klasse * k = new Klasse();
    sondern mit
    Klasse k=Klasse();
    gemacht, was man nur einmal machen kann.

    wenn jemand ne erklärung für mich hätte, wäre ich dankbar.

    lg
    mw

  • martmike
    Punkte
    50
    Beiträge
    8
    • 4. April 2007 um 14:18
    • #6

    wird eigentlich der Konstruktor der Basisklasse implizit aufgerufen oder muss ich das im Konstruktor der abgeleiteten Klasse befehlen?

  • ThomasW
    Punkte
    141
    Beiträge
    28
    • 4. April 2007 um 14:34
    • #7

    Implizit wird der Standardkonstrukor der Basisklasse ausgerufen.

    Wenn Du einen anderen verwenden möchtest, musst Du das in der konstruktor-Definition angeben.

    Code
    class B : public A
    {
        B(int a) : A(a)
        {
            ...
        };
    };

    Worauf du auch Acht geben musst, ist, dass Du den Destruktor auf virtual setzt. Sonst wird nur der Destruktor der Basisklasse aufgerufen, wenn Du ein polymorphes Objekt löschst.

  • sauzachn
    Punkte
    3.101
    Beiträge
    606
    • 4. April 2007 um 14:35
    • #8
    Zitat von martmike

    wird eigentlich der Konstruktor der Basisklasse implizit aufgerufen oder muss ich das im Konstruktor der abgeleiteten Klasse befehlen?


    Warum schaust du dir nicht ein C++ Tutorial an? Es gibt doch so einige Unterschiede zw. Java und C++ und wenn du jetzt jedes Mal hier fragst, wird das relativ viel.

    Man kanns alternativ auch ausprobieren ;) Einfach in den Basisctor eine Ausgabe schreiben und dann eine Unterklasse erzeugen :D

  • martmike
    Punkte
    50
    Beiträge
    8
    • 4. April 2007 um 14:37
    • #9

    1. mal es tut mir leid, ich habe mich verschrieben, wollte eigentlich fragen ob der destruktor der Basisklasse aufgerufen wird
    2. man wird doch noch fragen dürfen
    :sudern:

  • gelbasack
    Punkte
    6.525
    Beiträge
    1.241
    • 4. April 2007 um 15:30
    • #10

    Destruktoren werden auch alle aufgerufen, allerdings in der umgekehrten Reihenfolge.

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum