Using inheritance, derive two new classes from the WCS_String class:UpperCaseStr
ID: 3856442 • Letter: U
Question
Using inheritance, derive two new classes from the WCS_String class:UpperCaseString–This class will allow any characters to be stored but will store all alphabetic characters as upper case.DigitString–This class will allow only digits to be stored. Usage of other types of characters will cause an exception to be thrown.All error checking (bounds checking of indices, etc.) must be handled as exceptions (try, throw, catch). Your test program must demonstrate that all exception tests work. WCS_String.h
#ifndef WCS_STRING_H
#define WCS_STRING_H
#include <cctype>
#include <cstring>
#include <iostream>
using namespace std;
#pragma warning (disable:4996)
#ifdef WIN32
#define STRCMP_NO_CASE _strcmpi
#else
#define STRCMP_NO_CASE strcasecmp
#endif
class WCS_String
{
//************* Exceptions *****
public:
enum Exceptions {IndexOutOfBounds};
//************* Method Prototypes *****
public:
explicit WCS_String (const char * = "");
WCS_String (const WCS_String &) throw (...);
virtual ~WCS_String () throw ();
int Compare (const WCS_String &) const throw ();
int Compare (const char *) const throw ();
WCS_String & Concat (const WCS_String &) throw (...);
WCS_String & Concat (const char *) throw (...);
WCS_String & Copy (const WCS_String &) throw (...);
WCS_String & Copy (const char *) throw (...);
ostream & Display (ostream & = cout) const throw ();
bool GetAt (char &, int) const throw (...);
bool IsEmpty () const throw ();
size_t Length () const throw ();
istream & Read (istream & = cin) throw (...);
bool SetAt (char, int) throw (...);
WCS_String & ToLower () throw ();
WCS_String & ToUpper () throw ();
operator bool () const throw ();
operator const char * () const throw ();
WCS_String & operator = (const WCS_String &) throw (...);
WCS_String & operator = (const char *) throw (...);
bool operator < (const WCS_String &) const throw ();
bool operator < (const char *) const throw ();
bool operator <= (const WCS_String &) const throw ();
bool operator <= (const char *) const throw ();
bool operator == (const WCS_String &) const throw ();
bool operator == (const char *) const throw ();
bool operator >= (const WCS_String &) const throw ();
bool operator >= (const char *) const throw ();
bool operator > (const WCS_String &) const throw ();
bool operator > (const char *) const throw ();
bool operator != (const WCS_String &) const throw ();
bool operator != (const char *) const throw ();
WCS_String operator & (const WCS_String &) const throw (...);
WCS_String operator & (const char *) const throw (...);
WCS_String & operator &= (const WCS_String &) throw (...);
WCS_String & operator &= (const char *) throw (...);
char & operator [] (int) throw (...);
char operator [] (int) const throw (...);
private:
bool IsValidSubscript (int) const throw ();
void LocalCheckAndCopy (const char *) throw (...);
WCS_String & LocalConcat (const char *) throw (...);
void LocalCopy (const char *) throw (...);
WCS_String NewConcat (const char *) const throw (...);
static char ReadChar (istream & = cin) throw ();
operator char * () const throw ();
//************* Properties *****
private:
char * pChar;
size_t CharCount;
size_t MaxSize;
};
//************* Method Definitions *****
inline WCS_String::WCS_String (const char * p): CharCount (0), MaxSize (0), pChar (0)
{
LocalCopy (p);
}
inline WCS_String::WCS_String (const WCS_String & M)
{
LocalCopy (M.pChar);
}
inline int WCS_String::Compare (const WCS_String & M) const
{
return strcmp (pChar, M.pChar);
}
inline int WCS_String::Compare (const char * p) const
{
return strcmp (pChar, p);
}
inline WCS_String & WCS_String::Concat (const WCS_String & M)
{
return LocalConcat (M.pChar);
}
inline WCS_String & WCS_String::Concat (const char * p)
{
return LocalConcat (p);
}
inline WCS_String & WCS_String::Copy (const WCS_String & M)
{
return *this = M;
}
inline WCS_String & WCS_String::Copy (const char * p)
{
return *this = p;
}
inline ostream & WCS_String::Display (ostream & out) const
{
return out << pChar;
}
inline bool WCS_String::GetAt (char & c, int i) const
{
if (IsValidSubscript (i))
{
c = pChar [i];
return true;
}
else
return false;
}
inline bool WCS_String::IsEmpty () const
{
return Length () == 0;
}
inline bool WCS_String::IsValidSubscript (int i) const
{
return (i >= 0) && (i < static_cast <int> (CharCount));
}
inline size_t WCS_String::Length () const
{
return CharCount;
}
inline WCS_String WCS_String::NewConcat (const char * p) const
{
WCS_String S (*this);
S.Concat (p);
return S;
}
inline WCS_String::operator bool () const
{
return Length () > 0;
}
inline WCS_String::operator const char * () const
{
return pChar;
}
inline WCS_String & WCS_String::operator = (const WCS_String & M)
{
if (this != &M)
LocalCheckAndCopy (M.pChar);
else;
return *this;
}
inline WCS_String & WCS_String::operator = (const char * p)
{
LocalCheckAndCopy (p);
return *this;
}
inline bool WCS_String::operator < (const WCS_String & M) const
{
return Compare (M) < 0;
}
inline bool WCS_String::operator < (const char * p) const
{
return Compare (p) < 0;
}
inline bool operator < (const char * p, const WCS_String & S)
{
return S.Compare (p) > 0;
}
inline bool WCS_String::operator <= (const WCS_String & M) const
{
return Compare (M) <= 0;
}
inline bool WCS_String::operator <= (const char * p) const
{
return Compare (p) <= 0;
}
inline bool operator <= (const char * p, const WCS_String & S)
{
return S.Compare (p) >= 0;
}
inline bool WCS_String::operator == (const WCS_String & M) const
{
return Compare (M) == 0;
}
inline bool WCS_String::operator == (const char * p) const
{
return Compare (p) == 0;
}
inline bool operator == (const char * p, const WCS_String & S)
{
return S.Compare (p) == 0;
}
inline bool WCS_String::operator >= (const WCS_String & M) const
{
return Compare (M) >= 0;
}
inline bool WCS_String::operator >= (const char * p) const
{
return Compare (p) >= 0;
}
inline bool operator >= (const char * p, const WCS_String & S)
{
return S.Compare (p) <= 0;
}
inline bool WCS_String::operator > (const WCS_String & M) const
{
return Compare (M) > 0;
}
inline bool WCS_String::operator > (const char * p) const
{
return Compare (p) > 0;
}
inline bool operator > (const char * p, const WCS_String & S)
{
return S.Compare (p) < 0;
}
inline bool WCS_String::operator != (const WCS_String & M) const
{
return Compare (M) != 0;
}
inline bool WCS_String::operator != (const char * p) const
{
return Compare (p) != 0;
}
inline bool operator != (const char * p, const WCS_String & S)
{
return S.Compare (p) != 0;
}
inline WCS_String WCS_String::operator & (const WCS_String & M) const
{
return NewConcat (M.pChar);
}
inline WCS_String WCS_String::operator & (const char * p) const
{
return NewConcat (p);
}
inline WCS_String operator & (const char * p, const WCS_String & S)
{
WCS_String Temp (p);
return Temp.Concat (S);
}
inline WCS_String & WCS_String::operator &= (const WCS_String & M)
{
return Concat (M);
}
inline WCS_String & WCS_String::operator &= (const char * p)
{
return Concat (p);
}
inline char & WCS_String::operator [] (int i)
{
if (IsValidSubscript (i))
return pChar [i];
else
throw IndexOutOfBounds;
}
inline char WCS_String::operator [] (int i) const
{
return (*const_cast <WCS_String *> (this)).operator [] (i);
}
inline bool WCS_String::SetAt (char c, int i)
{
if ((i >= 0) && (i < static_cast <int> (CharCount)))
{
pChar [i] = c;
return true;
}
else
return false;
}
inline ostream & operator << (ostream & out, const WCS_String & M)
{
return M.Display (out);
}
inline istream & operator >> (istream & in, WCS_String & M)
{
return M.Read (in);
}
#pragma warning (default:4996)
#endif
Explanation / Answer
#include <string>
#include <cctype>
#include <stdexcept>
typedef std::string WCS_String ;
struct digit_string
{
digit_string( const WCS_String& m ) : str(s) { are_digits(str) ; }
bool set_at( char p, std::size_t pos )
{
if( !std::isdigit(p) )
throw std::domain_error( WCS_String("non numeral character '") + p + "'" ) ;
else str.at(pos) = p ;
return true ;
}
digit_string operator= ( const WCS_String& m) { if( are_digits(s) ) str = m; return *this ; }
friend inline std::ostream& operator<< ( std::ostream& stm, const digit_string& m )
{ return stm << m.str ; }
private:
WCS_String str ;
bool are_digits( const WCS_String& m )
{
for( char p :m ) if( !std::isdigit(p) )
throw std::domain_error( "non numeral in string '" + m + "'" ) ;
return true ;
}
};
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.