This seems to work with the overloaded "<<" and ">>" operators placed in the header file, but complains about not being able to access pch even though its a friend function and i have no idea why its doing so. Main.cpp seems to not have any problems using this string class, but with another program it complains about the << and >> operators. Any ideas/suggestions?
String.h as follows
Code:
#include <stdlib.h>
class String{
private:
char *pch; //Pointer to a CHar array
int length;
static char nul;
public:
String();
String(char *p);
String(String const &s);
~String();
bool operator == (String s2) const;
String operator = (String &s);
String operator + (String &s) const;
//friend ostream& operator << (ostream &os, String &s);
//friend istream& operator >> (istream &is, String &s); - I would put these in string.cpp but the compiler complains about not being able to access pch
friend ostream& operator << (ostream &os, String &s)
{
os << s.pch;
return os;
}
friend istream& operator >> (istream &is, String &s)
{
if(s.pch != &String::nul) delete[] s.pch;
char *ptemp = new char[1000];
is.getline(ptemp, 1000, '\n');
s.length = strlen(ptemp);
s.pch = new char [s.length +1];
strcpy(s.pch, ptemp);
return is;
}
};
String.cpp as follows
Code:
#include <iostream>
#include <stdlib.h>
using namespace std;
#include "String.h"
char String::nul = '\0';
//default constructor
String::String()
{
pch = 0;
length = 0;
}
String::String(char *p)
{
if( p == 0 ){abort();}
length = strlen(p);
pch = (char*) malloc(length+1);
strcpy(pch, p);
}
//copy constructor
String::String(String const &str)
{
if (str.pch==0){
pch = 0;
length = 0;
} else{
length = str.length;
pch = (char*) malloc(length+1);
strcpy(pch, str.pch);
}
}
//destructor
String::~String()
{
delete[] pch;
}
//overloaded '=='
bool String::operator == (String s2) const
{
if ( strcmp(pch, s2.pch) == 0 ) return true;
else{
return false;
}
}
String String::operator = (String &s)
{
String temp (s.pch);
if (s.length > length) {delete [] pch;} //free old memory
pch = new char[s.length];
length = s.length;
}
strcpy (pch, s.pch);
strcpy (temp.pch, s.pch);
return temp;
}
//overloaded '+'
String String::operator + (String &s) const
{
String temp;
temp.length = length + s.length;
if(temp.length == 0) return temp;
temp.pch = new char[temp.length +1];
strcpy(temp.pch, pch);
strcat(temp.pch, s.pch);
return temp;
}
Test module:
Code:
#include <iostream>
#include "String.h"
using namespace std;
int main()
{
String s1, s3;
String s2("This is a String");
cout << "Input a String: " << endl;
cin >> s1;
s1 = s2;
if (s1 == s2)
{
cout << "s1 is equal to s2" << endl;
}
s3 = s1 + s2;
cout << s3 << " = " <<s1 << " + " << s2 << endl;
return 0;
}