Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hausaufgabenhilfe: Konstruktor mit Initialisierungsliste

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.06.2019, 16:48 Uhr
coder09



Hi,

ich versuche meine Hausaufgaben zu zu machen. Habe schon angefangen und fast die Hälfte selbstständig hinbekommen.
Allerdings komme ich bei den Konstruktiven mit Initialisierungslisten nicht weiter.

Aufgabe als .pdf: https://www.docdroid.net/4HQT21V/in-modul2-f2019.pdf#page=2

Meine Lösung bis einschließlich Aufgabe 1a):


C++:
#include <iostream>
#include <cmath>

using namespace std;

class BYTE {
    protected:
        char *Low;
        bool valid;    
    
    private:
        void validate(){
            if(this->Low == NULL){
                this->valid = false;
                return;
            }
            
            if(strlen(this->Low) != 2){
                this->valid = false;
                return;
            }
            
            for(int i=0; i<2; i++){
                if(!((this->Low[i] >= 'A' && this->Low[i] <= 'F') || (this->Low[i] >= '0' && this->Low[i] <= '9'))){
                    this->valid = false;
                    return;
                }
            }
            this->valid = true;
        }
        
        void dec2hex(int value){
            this->Low = new char[2];
            int rest = value;
            for(int i=1; i>=0; i--){
                rest = value%16;
                value = value - rest;
                if(rest < 10 && rest > 0){
                    this->Low[i] = '0' + rest;
                } else if(rest >= 10){
                    this->Low[i] = 'A' + rest - 10;
                } else {
                    this->Low[i] = '0';
                }
            }
        }
        
    public:
        BYTE(char *Wert){
            this->Low = Wert;
            this->validate();
        }
        
        BYTE(int Wert){
            if(Wert >=0 && Wert <= 255){
                this->dec2hex(Wert);
                this->valid = true;
            } else {
                this->valid = false;
            }
        }
        
        BYTE(BYTE & BYTE2){
            this->Low = new char[2];
            strcpy(this->Low, BYTE2.getLow());
            this->valid = BYTE2.getValid();
        }
        
        char * getLow(){
            return this->Low;
        }
        
        bool getValid(){
            return this->valid;
        }    
        
        int getValue(){
            int summe = 0;
            if(this->valid){
                for(int i=0, p=strlen(this->Low)-1; i<2; i++, p--){
                    if(this->Low[i] >= 'A' && this->Low[i] <= 'F'){
                        summe += pow(16, p) * (this->Low[i] - 'A' + 10);
                    } else {
                        summe += pow(16, p) * (this->Low[i] - '0');
                    }    
                }
                return summe;
            }
            return -1;
        }
};

class EVLE {
    private:
        EVLE * Next;
        long Check;
        
    public:
        EVLE(EVLE * N, long C){
            
        }
        
        EVLE(EVLE & EVLE2){
            
        }
        
        EVLE * getNext(){
            return this->Next;
        }
        
        long getCheck(){
            return this->Check;
        }
        
        void setNext(EVLE * n){
            this->Next = n;
        }
        
        void setCheck(long C){
            this->Check = C;
        }
    
};

class WORT : public BYTE, public EVLE {
    
    private:
        BYTE * high;
        long Value;
        
    public:
        WORT(char * ZK , EVLE * N, long C):BYTE(0), EVLE(N, C) {
            //hier komme ich nicht weiter
            
        }
        
        WORT(long LWert, EVLE *N, long C):BYTE(0), EVLE(N, C){
            //und hier
        }
        
        WORT(WORT & WORT2){
            
        }
        
        int getValue(){
            return this->Value;
        }
        
        char * getWert(){
            return "";
        }
        
        bool operator==(WORT const& WORT1, WORT const& WORT2){
            
        }
        
        ~WORT(){
            
        }
};

int main(int argc, char *argv[]) {

}




Ich verstehe das so:
Bei Aufgabe 1a) bekommt man einen char* übergeben.
Das übergebene char* muss eine Länge von 4 haben.
Dann soll das char in der Mitte getrennt werden. Die 2 höheren Elemente sollen in dem Attribut 'low' aus der klasse BYTE abgespeichert werden und die 2 niedrigeren Elemente in dem Attribut 'high' der Klasse WORT. Nun ist meine Frage wie ich das aufteilen soll, wenn Initialisierungslisten gefordert sind?

Hoffe jemand versteht was ich meine und kann mir helfen.

Lg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.06.2019, 09:30 Uhr
ao

(Operator)


Meine Güte, was für ein blödsinniges Design! Ein Wort ist ein Low-Byte, das über einen Pointer ein weiteres Byte (das High-Byte) kennt - da fällt mir einfach nur die Kinnlade runter.

Du hast mein volles Mitgefühl.

Bist du sicher, dass Low (Member von BYTE) ein Pointer auf char sein soll? Ich hätte da geschrieben

char Low[3];

und es intern als nullterminierten String interpretiert. Dann braucht man nämlich die Umrechnerei (dec2hex und getValue) nicht zu Fuß zu machen, dazu gibt es Hilfsfunktionen (C-Funktionen atoi, itoa, strtol, sprintf, sscanf, sowie die C++-Klasse std::stringstream und die überladene Methode std::string::to_string).

Um die Frage zu den Initialisierungslisten kann ich mich erst später kümmern - muss erst mal in Ruhe nachvollziehen, was das werden soll.

Dieser Post wurde am 26.06.2019 um 10:23 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.06.2019, 20:23 Uhr
ao

(Operator)


So, jetzt. Ich vermute, es ist etwas in dieser Art gemeint (Konstruktion aus int und Destruktion):

C++:
class WORT : public BYTE, public EVLE {
    
    private:
        BYTE * high;
        long Value;
        
    public:
        
        WORT(long LWert, EVLE *N, long C)
        :BYTE(LWert / 256)
        , EVLE(N, C)
        , high (new BYTE(LWert % 256))
        , Value(LWert)
        {
        }
        
        ~WORT()
        {
            delete high;
        }
};



Der Konstruktor initialisiert nacheinander die Basisklassen BYTE und EVLE und die Member high und Value.

Der Destruktor zerstört das Member high und macht damit die Erzeugung im Konstruktor rückgängig.

In der Klasse BYTE initialisieren die verschiedenen Konstruktoren das Member Low unterschiedlich, teilweise kopieren sie einfach den eingegebenen Pointer, teilweise holen sie Speicher vom Heap. Das kann so nicht bleiben. Klar, warum?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.06.2019, 20:55 Uhr
ao

(Operator)


Kritik an der Aufgabenstellung wegen Zwecklosigkeit wieder gelöscht.
Dieser Post wurde am 27.06.2019 um 08:55 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: