CD5250 -
Objektorienterad programutveckling med C++, 5 poäng, period
4,
2001
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. |
|
|