1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

c++ objektorientiert

  • martmike
  • 4. April 2007 um 01:08
  • Unerledigt
  • martmike
    3
    martmike
    Mitglied
    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
    4
    ThomasW
    Mitglied
    Reaktionen
    1
    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
    32
    hal
    Mitglied
    Reaktionen
    52
    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?

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    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

    640K ought to be enough for anybody. :eek2:

  • martmike
    3
    martmike
    Mitglied
    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
    3
    martmike
    Mitglied
    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
    4
    ThomasW
    Mitglied
    Reaktionen
    1
    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
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    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 :winking_face: Einfach in den Basisctor eine Ausgabe schreiben und dann eine Unterklasse erzeugen :grinning_squinting_face:

    Dipper dipper dii dipper dii dipper dii duuu

  • martmike
    3
    martmike
    Mitglied
    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
    25
    gelbasack
    Mitglied
    Reaktionen
    90
    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.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung