CD5250 - Objektorienterad programutveckling med C++, 5 poäng, period 3, 2002

Laboration 3

intro

Syftet med denna laboration är att implementera kopiering och tilldelning. Dessutom skall vi öva på operatoröverlagring.

Efter avklarad laboration skall ni kunna:

  • Implementera kopieringskonstruktorer (copy constructors) för en klass med dynamiskt allokerat data. Dvs en klass som inte har allt data som lokala variabler.
  • Implementera tilldelningsoperator för en klass som ovan.
  • Implementera aritmetiska operatorer för klasser som ovan.
  • A. string

    class String
    {
    public:
       String(char const* s);
       ~String();
    protected:
       char * str;
       int len;
    };
    Exempel 1.Klassdeklaration.
    String::String(char const* s)
    {
       len = strlen(s);
       str = new char[len + 1];
       strcpy(str, s);
    }
    
    String::~String()
    {
       delete [] str;
    }
    Exempel 2.Metoddefinitioner.
    int main(void)
    {
       String s1("Keep it simple");
       String s2;        // Gör en konstruktor som initierar en tom sträng.
       String s3 = s1;   // Fel!,  
       String s4(s1);    // Fel!,  
       s2 = s1;          // Fel!,  
       s3 = s3;          // Obs!, även detta skall fungera...
       return 0;
    }
    Exempel 3.Huvudprogram.

    Stega igenom ovanstående kod, sats för sats, med hjälp av debuggern och kontrollera att ni förstår vad som händer och varför. Ni skall kunna förklara detta för labassistenten. Inför redovisningen skall ni ha gjort en lista med vad som händer i felsituationerna ovan samt berätta vad ni gjort för att lösa problemen. För att avhjälpa dessa fel skall ni komplettera klassen String genom att implementera en egen kopieringskonstruktor och tilldelningsoperator.

    Observera att klassen är döpt till String med stort 'S' och undviker därmed kollision med STL-string-klassen. En annan variant hade varit att skapa klassen i ett eget namespace. Det behöver ni alltså inte göra här.

    B. string 2

    Utöka er klass "String" med följande operatorer:

  • Överlagra [] operatorn så att indexeringskontoll sker. Om man försöker indexera utanför textsträngen returneras lämpligen '\0'.
  • Överlagra + operatorn så att man kan slå samman två objekt av klassen String.
  • Överlagra << operatorn så att utskrift kan ske på vanligt sätt.
  • String str1 = "Kalle", str2, str3, str4;
    str2 = " och ";
    str3 = "Musse";
    str4 = str1 + str2 + str3;
    cout << str4;
    Exempel 4.

    C. string 3

    Antag att ni vill lägga ihop en vanlig textsträng med ett objekt av klassen String. Detta går bra om man gör på följande sätt:

    String str1("Kalle"), str2;
    str2 = str1 + " Anka";          // Rätt
    Exempel 5.

    Detta fungerar eftersom konstruktorn i klassen String fungerar som en konverterare. Men om man gör så här:

    String str1(" Anka"), str2;
    str2 = "Kalle" + str1;          // Fel
    Exempel 6.

    Då går det inte så bra, eftersom operatorn '+' appliceras på "Kalle", vilket inte är ett objekt av klassen String. Detta kan även här kringgås genom att definiera en vanlig funktion som gör detta och sedan deklarera den som en friend-metod till klassen String. Efter att ha gjort detta skall ni kunna exekvera följande kod:

    String t1("Kalle");
    String t2;
    String t3(t1);
    t2 = "Här kommer " + t1;
    t3 = t2 + " Anka";
    cout << t1 << endl;
    cout << t2 << endl;
    cout << t3 << endl;
    Exempel 7.

    och erhålla följande utskrift:

    Kalle
    Här kommer Kalle
    Här kommer Kalle Anka
    Exempel 8.
    Aktuellt
    Utvärdering2
    Nyheter
    Föreläsning 14
    Laboration 6
    Projektuppgift
    CD5250
    Nyheter
    Kursinformation
    Föreläsningar
    Labbar
    Projektuppgift
    C --> C++
    STL-intro
    Size-klassen
    Utvärdering
    Utvärdering2
    Visual C++
    Kursplan
    Schema
    Underrubriker
    string
    string 2
    string 3
    Ansvarig lärare: Martin Skogevall - martin.skogevall@mdh.se
    Senast uppdaterad: Tue Mar 05 16:57:55 GMT+01:00 2002