Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

The purpose of this assignment is to rewrite this class by replacing the static

ID: 3750755 • Letter: T

Question

The purpose of this assignment is to rewrite this class by replacing the static array with a pointer (dynamic array). You are required to modify the String class accordingly:

Data: we wish to allow our String class to accommodate strings of different sizes. To that end, instead of storing a string’s characters in a fixed-size array, each String object should contain the following data as part of its internal representation:

(1) a character pointer meant to point to a dynamically-allocated array of characters. (2) a length field that will hold the current length of the string at any given moment.

Operations: same as the methods in String class, plus the “big three”( destructor, copy constructor, and assignment operator overloading).

Modularity: The String class code must be put in its own module, i.e., a file mystring2.h (the header file) should hold the class definition (use conditional compilation directives) and a file mystring2.cpp (the implementation file) should hold the method definitions.

Assign5driver.cpp --  A driver program provides a main program to test your new class.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//File: mystring1.h

// ================

// Interface file for user-defined String class.

#ifndef _MYSTRING_H

#define _MYSTRING_H

#include<iostream>

#include <cstring> // for strlen(), etc.

using namespace std;

#define MAX_STR_LENGTH 200

class String {

public:

String();

String(const char s[]); // a conversion constructor

void append(const String &str);

// Relational operators

bool operator ==(const String &str) const;   

bool operator !=(const String &str) const;

bool operator >(const String &str) const;   

bool operator <(const String &str) const;   

bool operator >=(const String &str) const;

String operator +=(const String &str);   

void print(ostream &out) const;   

int length() const;

char operator [](int i) const; // subscript operator  

private:

char contents[MAX_STR_LENGTH+1];

int len;

};

ostream & operator<<(ostream &out, const String & r); // overload ostream operator "<<" - External!  

#endif /* not defined _MYSTRING_H */

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//File: mystring1.h

// ================

// Interface file for user-defined String class.

#include"mystring1.h"

String::String()

{

contents[0] = '';

len = 0;

}

String::String(const char s[])

{

len = strlen(s);

strcpy_s(contents, s);

}

void String::append(const String &str)

{

strcat_s(contents, str.contents);

len += str.len;

}

bool String::operator ==(const String &str) const

{

return strcmp(contents, str.contents) == 0;

}

bool String::operator !=(const String &str) const

{

return strcmp(contents, str.contents) != 0;

}

bool String::operator >(const String &str) const

{

return strcmp(contents, str.contents) > 0;

}

bool String::operator <(const String &str) const

{

return strcmp(contents, str.contents) < 0;

}

bool String::operator >=(const String &str) const

{

return strcmp(contents, str.contents) >= 0;

}

String String::operator +=(const String &str)

{

append(str);

return *this;

}

void String::print(ostream &out) const

{

out << contents;

}

int String::length() const

{

return len;

}

char String::operator [](int i) const

{

if (i < 0 || i >= len) {

cerr << "can't access location " << i

<< " of string "" << contents << """ << endl;

return '';

}

return contents[i];

}

ostream & operator<<(ostream &out, const String & s) // overload ostream operator "<<" - External!

{

s.print(out);

return out;

}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/**

* cmpsc122 Assignment 6 test file

* File Name: Assign4driver.cpp

*

* Description: This program demonstrates a basic String class that implements

* dynamic allocation and operator overloading.

*

*/

#include <iostream>

#include "mystring1.h"

using namespace std;

/************************ Function Prototypes ************************/

/*

* Function: PrintString

* Usage: PrintString(str);

*

* Prints out the value and length of the String object passed to it.

*/

void PrintString(const char *label,

const String &str); // overloaded ostream operator << is used in the definition.

/*************************** Main Program **************************/

int main()

{

String str1, str2("init2"), str3 = "init3"; // Some String objects. Using constructor for copy

char s1[100], s2[100], s3[100]; // Some character strings.

// Print out their initial values...

cout << "Initial values:" << endl;

PrintString("str1", str1);

PrintString("str2", str2);

PrintString("str3", str3);

// Store some values in them...

cout << " Enter a value for str1 (no spaces): ";

cin >> s1;

str1 = s1;

cout << " Enter a value for str2 (no spaces): ";

cin >> s2;

str2 = s2;

cout << " Enter a value for str3 (no spaces): ";

cin >> s3;

str3 = s3;

cout << " After assignments..." << endl;

PrintString("str1", str1);

PrintString("str2", str2);

PrintString("str3", str3);

// Access some elements...

int i;

cout << " Enter which element of str1 to display: ";

cin >> i;

cout << "Element #" << i << " of str1 is '" << str1[i]

<< "'" << endl;

cout << " Enter which element of str2 to display: ";

cin >> i;

cout << "Element #" << i << " of str2 is '" << str2[i]

<< "'" << endl;

cout << " Enter which element of str3 to display: ";

cin >> i;

cout << "Element #" << i << " of str3 is '" << str3[i]

<< "'" << endl;

// Append some strings...

cout << " Enter a value to append to str1 (no spaces): ";

cin >> s1;

// str1.append(s1); // Actually, the cstring is converted to String object here by the constructor

str1 += s1; // same as above

cout << " Enter a value to append to str2 (no spaces): ";

cin >> s2;

str2 += s2;

  

cout << " Enter a value to append to str3 (no spaces): ";

cin >> s3;

str3 += s3;

cout << " After appending..." << endl;

PrintString("str1", str1);

PrintString("str2", str2);

PrintString("str3", str3);

// Compare some strings...

cout << " Comparing str1 and str2..." << endl;

cout << """;

cout<< str1; // test the overloading of ostream operator <<

cout << "" is ";

if (str1 < str2) { // test the overloading of comparison operator <

cout << "less than";

} else if (str1 > str2) {

cout << "greater than";

} else {

cout << "equal to";

}

cout << " "";

cout << str2;

cout << """ << endl;

cout << " test the = operator, after str1 = str2; "<< endl;

str1 = str2;

PrintString("str1", str1);

PrintString("str2", str2);

str1 += s1;

cout << " After str1 = str1 + s1: "<< endl;

PrintString("str1", str1);

PrintString("str2", str2);

String str4(str3);

cout << " test the copy constructor, after str4(str3);"<< endl;

PrintString("str3", str3);

PrintString("str4", str4);

cout << " after appending str3 by str2" << endl;

str3 += str2;

PrintString("str3", str3);

PrintString("str4", str4);

cout<< " str2, str4 are not changed. Type any letter to quit." << endl;

char q;

cin >> q;

return 0;

}

/*********************** Function Definitions **********************/

void PrintString(const char *label,

const String &str)

{

cout << label << " holds "";

cout << str; // << is overloaded

cout << "" (length = " << str.length() << ")" << endl;

}

Explanation / Answer

//File: mystring1.h
// ================
// Interface file for user-defined String class.
#ifndef _MYSTRING_H
#define _MYSTRING_H
#include <iostream>
#include <string>
#include <string.h>
// for strlen(), etc.
using namespace std;
#define MAX_STR_LENGTH 200
class String {
public:
String();
String(const char s[]); // a conversion constructor
String(String &a);
void append(const String &str);
// Relational operators
~String(){
   delete[] contents;
}
bool operator ==(const String &str) const;
bool operator !=(const String &str) const;
bool operator >(const String &str) const;
bool operator <(const String &str) const;
bool operator >=(const String &str) const;
String operator +=(const String &str);
void operator =(const String &M );
void print(ostream &out) const;
int length() const;
char operator [](int i) const; // subscript operator
private:
char *contents;
int len;
};
ostream & operator<<(ostream &out, const String & r); // overload ostream operator "<<" - External!
#endif /* not defined _MYSTRING_H */

cpp file

/*
* cmpsc122 Assignment test file
* File Name: mystringDriver.cpp
*
* Description: This program demonstrates a basic String class that
implements
* dynamic allocation and operator overloading.
*
*/
#include <iostream>
#include <string>
#include<string.h>
#include "mystring2.h"
using namespace std;


/************************ Function Prototypes ************************/
/*
* Function: PrintString
* Usage: PrintString(str);
*
* Prints out the value and length of the String object passed to it.
*/
void PrintString(const char *label,
const String &str);    // overloaded ostream operator << is used in the definition.

/*************************** Main Program **************************/
int main()
{
String str1;
String str2("init2");
String str0("init3");
String str3 = str0; // Some String objects.Using onstructor for copy
char s1[100], s2[100], s3[100];              // Some character strings.
// Print out their initial values...
cout << "Initial values:" << endl;
PrintString("str1", str1);
PrintString("str2", str2);
PrintString("str3", str3);
// Store some values in them...
cout << " Enter a value for str1 (no spaces): ";
cin >> s1;
str1 = s1;
cout << " Enter a value for str2 (no spaces): ";
cin >> s2;
str2 = s2;
cout << " Enter a value for str3 (no spaces): ";
cin >> s3;
str3 = s3;
cout << " After assignments..." << endl;
PrintString("str1", str1);
PrintString("str2", str2);
PrintString("str3", str3);
// Access some elements...
int i;
cout << " Enter which element of str1 to display: ";
cin >> i;
cout << "Element #" << i << " of str1 is '" << str1[i]
<< "'" << endl;
cout << " Enter which element of str2 to display: ";
cin >> i;
cout << "Element #" << i << " of str2 is '" << str2[i]
<< "'" << endl;
cout << " Enter which element of str3 to display: ";
cin >> i;
cout << "Element #" << i << " of str3 is '" << str3[i]
<< "'" << endl;
// Append some strings...
cout << " Enter a value to append to str1 (no spaces): ";
cin >> s1;
// str1.append(s1); // Actually, the cstring is converted to String object here by the constructor
str1 += s1;   // same as above
cout << " Enter a value to append to str2 (no spaces): ";
cin >> s2;
str2 += s2;
cout << " Enter a value to append to str3 (no spaces): ";
cin >> s3;
str3 += s3;
cout << " After appending..." << endl;
PrintString("str1", str1);
PrintString("str2", str2);
PrintString("str3", str3);
// Compare some strings...
cout << " Comparing str1 and str2..." << endl;
cout << """;
cout<< str1;   // test the overloading of ostream operator <<
cout << "" is ";
if (str1 < str2) { // test the overloading of comparison operator <
cout << "less than";
} else if (str1 > str2) {
cout << "greater than";
} else {
cout << "equal to";
}
cout << " "";
cout << str2;
cout << """ << endl;
cout << " test the = operator, after str1 = str2; "<< endl;
str1 = str2;
PrintString("str1", str1);
PrintString("str2", str2);
str1 += s1;
cout << " After str1 = str1 + s1: "<< endl;
PrintString("str1", str1);
PrintString("str2", str2);
String str4(str3);
cout << " test the copy constructor, after str4(str3);"<< endl;
PrintString("str3", str3);
PrintString("str4", str4);
cout << " after appending str3 by str2" << endl;
str3 += str2;
PrintString("str3", str3);
PrintString("str4", str4);
cout<< " str2, str4 are not changed. Type any letter to quit." << endl;
char q;
cin >> q;
return 0;
}
/*********************** Function Definitions **********************/
void PrintString(const char *label,
const String &str)
{
cout << label << " holds "";
cout << str;                                // << is overloaded
cout << "" (length = " << str.length() << ")" << endl;
}

String::String()
{
contents = new char[MAX_STR_LENGTH];
len = 0;
}

String::String(const char s[])
{
len = strlen(s);
contents = new char[len];
strcpy(contents, s);
}

String::String(String &a){
   contents = new char[a.len];
   len = a.len;
}
void String::append(const String &str)
{
strcat(contents, str.contents);
len += str.len;
}

void String::operator=(const String &s ){
   contents = new char[s.len];
   len = s.len;

}

bool String::operator ==(const String &str) const
{
return strcmp(contents, str.contents) == 0;
}
bool String::operator !=(const String &str) const
{
return strcmp(contents, str.contents) != 0;
}
bool String::operator >(const String &str) const
{
return strcmp(contents, str.contents) > 0;
}
bool String::operator <(const String &str) const
{
return strcmp(contents, str.contents) < 0;
}
bool String::operator >=(const String &str) const
{
return strcmp(contents, str.contents) >= 0;
}
String String::operator +=(const String &str)
{
append(str);
return *this;
}
void String::print(ostream &out) const
{
out << contents;
}
int String::length() const
{
return len;
}
char String::operator [](int i) const
{
if (i < 0 || i >= len) {
cerr << "can't access location " << i
<< " of string "" << contents << """ << endl;
return '';
}
return contents[i];
}
ostream & operator<<(ostream &out, const String & s) // overload ostream operator "<<" - External!
{
s.print(out);
return out;
}