objekt einer klasse überschreibt objekt einer anderen klasse :-P



  • Servus!
    ich habe zwei klassen

    class Auto{

    public:
    .....
    Auto(char farbe[10]);
    ~Auto();
    ......

    private:
    ..........
    int KennNr;
    ..........
    };

    Auto::Auto(){
    .....
    KennNr=1; ...
    }

    Auto::~Auto(void){};

    class HRLager{

    private:
    .....
    int lagernummer;
    int kapazitaet;
    int fuellstand;
    ............
    public:
    HRLager();
    ~HRLager();
    ..........
    };

    HRLager::HRLager(){
    lagernummer=0;
    kapazitaet=100;
    fuellstand=0;
    .......

    }

    HRLager::~HRLager(){};

    wenn ich nun in main zwei objekte erzeuge

    void main(void){
    Auto trabbi();
    HRLager HRL1();
    }

    überschreibt der konstruktor von HRLager beim erstellen von HRL1 die KennNr vom trabbi.
    beim debuggen ist mir dann aufgefallen, daß der this zeiger beim aufrufen des trabbi konstruktors die selbe speicheradresse wie der this zeiger beim aufrufen des HRL1 konstruktors hat.
    hoffe mir ist noch zu helfen ;-D

    gruß
    sepp

    PS: wie kann ich wenn ich mit Auto *trabbi=new(Auto); einen zeiger deklariere
    paramerter für den standartkonstruktor mitübergeben?



  • Da Du ein char[] verwendest verwette ich einfach mal 5 EUR darauf, daß Du irgendwo in der Klasse Auto mit dem char-Array im Konstruktor was falsch initalisierst, über die Arraygrenzen in fremden Speicher rausschreibst und daher das andere Objekt beschädigst.

    Also: von Klasse Auto die komplette Angabe aller Membervariablen + den Code des Konstruktors...

    Weiterhin: bitte Code-Tags für bessere Lesbarkeit verwenden.

    Aufruf von Konstruktor mit Params bei new:

    Auto* pAuto = new Auto("Audio 80");
    

    Lass übrigens das (void) in der Parameterliste weg. Ist in C++ nicht notwendig.

    Wie Du siehst, ist Dir durchaus zu helfen. 😉



  • Servus!
    thx für deinen post erstmal.
    ich kopiere den string "rot" (mit strncpy) in das farbe[10] feld rein,
    sollte deshalb eigentlich keine probs geben,
    aber das verwunderliche ist doch, daß der thiszeiger bei beiden objekten die selbe adresse hat.
    thx für den new befehl 🙂

    gruß
    sepp



  • Original erstellt von [Sepp]:
    **aber das verwunderliche ist doch, daß der thiszeiger bei beiden objekten die selbe adresse hat.
    **

    Das hat mich gerade dazu gebracht die Sache noch mal anzusehen... hab's beim ersten Durchlauf nicht erkannt:

    Auto trabbi();
    HRLager HRL1();
    

    ist falsch. Du mußt die Objekte in dieser Form hier instanziieren:

    Auto trabbi;
    HRLager HRL1;
    

    Ich sehe ehrlich gar nicht, wo Du da Objekte angelegt hattest, so daß ein Zeiger entstehen konnte... na egal.

    Nun sollte es funzen.

    Übrigens, zur Speicherung von Strings solltest Du statt char[] lieber std::string aus <string> verwenden.

    [ Dieser Beitrag wurde am 22.06.2003 um 19:34 Uhr von Marc++us editiert. ]



  • Re,

    Jetzt werd ich gleich rot 😉
    ich depp hab nämlich das falsch gepostet (nächstes mal doch lieber copy/paste machen hehe)
    so stehts in wirklichkeit in meiner main:

    void main(void){
            Auto trabbi("rot");
            HRLager L1;
            ...........
    }
    

    und die objekte existieren beide bis zum ende von main (laute debugger 😉 )
    bis denne

    seppala



  • Ich spam hier was rum und laber wirklich nur müll 😃
    nach einer neuen überprüfung des this zeigers, mußte ich feststellen, daß er doch unterschiedlich ist. also liegts nicht dadran.

    da drängt sich mir allerdings eine neue frage auf.
    wenn man in seiner klasse eine static int variable deklariert hat.
    dann muß man die ja außerhalb der klasse z.b. mit

    int Klassennamme::variablennamen=0;

    initialisieren.

    wird die variable bei jeder deklaration eines neuen objektes der klasse neu initialisiert?

    gruß
    sepp



  • Original erstellt von [Sepp]:
    **Ich spam hier was rum und laber wirklich nur müll 😃
    nach einer neuen überprüfung des this zeigers, mußte ich feststellen, daß er doch unterschiedlich ist. also liegts nicht dadran.

    da drängt sich mir allerdings eine neue frage auf.
    wenn man in seiner klasse eine static int variable deklariert hat.
    dann muß man die ja außerhalb der klasse z.b. mit

    int Klassennamme::variablennamen=0;

    initialisieren.

    wird die variable bei jeder deklaration eines neuen objektes der klasse neu initialisiert?

    gruß
    sepp**

    Ja, alle weiteren Instanzen deiner Klasse werden den selben Wert für "Variablennamen" wie die vorherigen auch besitzen. Soweit ich weiß, benutzen sie sogar alle den selben speicher.



  • hihi ich meinte eigentlich
    ob bei jeder neudeklaration eines objektes die statische variable wieder auf 0 zurück gesetzt wird.

    zu dem thema hab ich gleich noch ne frage, gibt's was zu beachten wenn man zwei verschiedene klassen hat und beide klassen eine static int variable (natürlich mit unterschiedlichen namen)haben?

    ~Sepp



  • Also

    ich hab mal die deklaration umgedreht:
    vorher:

    Auto trabbi("rot");
    HRLager HR1;

    nacher:

    HRLager HR1;
    Auto trabbi("rot);

    siehe da, es wird nichts mehr überschrieben,
    kann mir vielleicht jemand sagen warum das so ist?
    ganzen nachmittag mit dem ****** verplämpert, da intressierts mich dann doch ;-))

    gruß
    und vielen dank für die mühe
    Seppl



  • Original erstellt von [Sepp]:
    ob bei jeder neudeklaration eines objektes die statische variable wieder auf 0 zurück gesetzt wird.

    NEIN! Das wäre ja völlig sinnlos.



  • Weil Du mit Sicherheit den Konstruktor von Auto falsch programmiert hast und Deine Kopie des Strings nicht richtig funktioniert.

    siehe meine erste Antwort:

    *Da Du ein char[] verwendest verwette ich einfach mal 5 EUR darauf, daß Du irgendwo in der Klasse Auto mit dem char-Array im Konstruktor was falsch initalisierst, über die Arraygrenzen in fremden Speicher rausschreibst und daher das andere Objekt beschädigst.
    Also: von Klasse Auto die komplette Angabe aller Membervariablen + den Code des Konstruktors...


Anmelden zum Antworten