home *** CD-ROM | disk | FTP | other *** search
- /*
- prog5-?.cpp
-
- En enkel strängklass som demonstrerar överlagrade operatorer
-
- Klassen cstring (inte string, för att undvika konflikt med
- eventuella strängklasser i kompilatorns bibliotek) inkapslar
- vanliga teckensträngar och tar hand om den allokering och de-
- allokering av minne som krävs. Operatorer för tilldelning,
- åtkomst av enskilda tecken, jämförelse och sammanslagning har
- överlagrats.
- För att inte krångla till exemplet kopieras strängdata alltid,
- och inga felkontroller görs. Jämförelse av strängar sker med
- strcmp, vilket kan ge oväntat resultat (tex för strängar inne-
- hållande å, ä och ö).
-
- */
-
- #include <stdio.h>
- #include <string.h> // <-- behövs för standardsträngfunktionerna
-
- class cstring
- {
- private:
-
- // pekare till strängen
- char* ptr;
-
- public:
-
- // förvald konstruktor
- cstring() { ptr = 0; }
-
- // konstruktor för initiering med strängpekare
- cstring(const char*);
-
- // kopieringskonstruktor
- cstring(const cstring&);
-
- // destruktor
- ~cstring();
-
- // skriv ut strängen
- void print() { printf("\"%s\"",ptr); }
-
- // överlagrade tilldelningsoperatorer
- cstring& operator=(const char*);
- cstring& operator=(const cstring&);
-
- // överlagrade operatorer för åtkomst till vektorelement
- // notera att vi kan överlagra medlemmar som är const
- // respektive icke-const
- char& operator[](int i)
- { return ptr[i]; }
- const char& operator[](int i) const
- { return ptr[i]; }
-
- // överlagrade relationsoperatorer
- int operator==(const char* s) const
- { return strcmp(ptr,s) == 0; }
- int operator==(const cstring& s) const
- { return strcmp(ptr,s.ptr) == 0; }
- int operator!=(const char* s) const
- { return strcmp(ptr,s) != 0; }
- int operator!=(const cstring& s) const
- { return strcmp(ptr,s.ptr) != 0; }
- int operator<(const char* s) const
- { return strcmp(ptr,s) < 0; }
- int operator<(const cstring& s) const
- { return strcmp(ptr,s.ptr) < 0; }
- int operator>(const char* s) const
- { return strcmp(ptr,s) > 0; }
- int operator>(const cstring& s) const
- { return strcmp(ptr,s.ptr) > 0; }
- int operator<=(const char* s) const
- { return strcmp(ptr,s) <= 0; }
- int operator<=(const cstring& s) const
- { return strcmp(ptr,s.ptr) <= 0; }
- int operator>=(const char* s) const
- { return strcmp(ptr,s) >= 0; }
- int operator>=(const cstring& s) const
- { return strcmp(ptr,s.ptr) >= 0; }
-
- // överlagrad additionsoperator
- friend cstring operator+(const cstring& s1,const cstring& s2);
- };
-
- cstring::cstring(const char* s)
- {
- ptr = new char[strlen(s)+1];
- strcpy(ptr,s);
- }
-
- cstring::cstring(const cstring& s)
- {
- ptr = new char[strlen(s.ptr)+1];
- strcpy(ptr,s.ptr);
- }
-
- cstring::~cstring()
- {
- if(ptr)
- {
- delete[] ptr;
- }
- }
-
- cstring& cstring::operator=(const char* s)
- {
- if(ptr)
- {
- delete[] ptr;
- }
- ptr = new char[strlen(s)+1];
- strcpy(ptr,s);
- return *this;
- }
-
- cstring& cstring::operator=(const cstring& s)
- {
- if(ptr)
- {
- delete[] ptr;
- }
- ptr = new char[strlen(s.ptr)+1];
- strcpy(ptr,s.ptr);
- return *this;
- }
-
- // Överlagrad additionsoperator - lägger ihop två strängar.
- // Notera att denna operator inte är medlem i cstring, bara
- // en vän till klassen.
- cstring operator+(const cstring& s1,const cstring& s2)
- {
- cstring s;
-
- s.ptr = new char[strlen(s1.ptr)+strlen(s2.ptr)+1];
- strcpy(s.ptr,s1.ptr);
- strcat(s.ptr,s2.ptr);
- return s;
- }
-
- // testa strängklassen
- main()
- {
- // initiering
- cstring s = "musselsoppa";
- cstring s2 = s;
- cstring s3 = s + ", tack!";
- cstring s4;
-
- // tilldelning och addition
- s4 = s2 + "ns at" + "tack!";
-
- // utskrift
- printf("s = "); s.print();
- printf("\ns2 = "); s2.print();
- printf("\ns3 = "); s3.print();
- printf("\ns4 = "); s4.print();
-
- // jämförelse
- if(s == s2)
- {
- printf("\ns == s2\n");
- }
- if(s2 != s3)
- {
- printf("s2 != s3\n");
- }
- if(s3 < s4)
- {
- printf("s3 < s4\n");
- }
-
- // åtkomst till enskilda tecken
- printf("s[1] = '%c'\n",s[1]);
-
- return 0;
- }
-