PolteRGeisT
03-07-2004, 08:14 PM
I'm getting a VERY bizzare error from this code. It's a simple string class, I only want to see if it's my compiler that's acting funny. thankx.
#include <iostream>
#include <string>
class String
{
public:
String();
String(const String &);
String(const String *);
String(const char *);
virtual ~String();
friend ostream &operator<< (ostream &, String &);
friend istream &operator>> (istream &, String &);
unsigned char &operator[](unsigned int);
unsigned char &operator[](unsigned int) const;
unsigned int length() const { return _length; }
const unsigned char at(unsigned int) const;
private:
unsigned char *string;
unsigned int _length;
unsigned char decoy_input;
unsigned int ctoc_assgn;
void __ctoc_assgn_lock() { ctoc_assgn = 0; }
void __ctoc_assgn_unlock() { ctoc_assgn = 1; }
unsigned int __ctoc_assgn_status() const { return ctoc_assgn; }
unsigned int strlen() const;
};
String::String()
{
string = new unsigned char;
string[0] = '\0';
_length = 0;
decoy_input = 0;
__ctoc_assgn_unlock();
}
String::String(const String &rhs)
{
this->_length = rhs.length();
for (int i=0; i < _length; ++i)
*(string + i) = rhs.at(i);
decoy_input = 0;
*(string + _length) = char (0);
__ctoc_assgn_unlock();
}
String::String(const String *rhs)
{
this->_length = rhs->length();
for (int i=0; i < _length; ++i)
*(string + i) = rhs->at(i);
decoy_input = 0;
*(string + _length) = char (0);
__ctoc_assgn_unlock();
}
String::String(const char *s)
{
int i;
for (i=0; s[i]; ++i)
*(string + i) = s[i];
decoy_input = 0;
*(string + _length) = char (0);
_length = i;
__ctoc_assgn_unlock();
}
String::~String()
{
delete [] string;
string = NULL;
_length = 0;
}
ostream &operator<<(ostream &__cout, String &rhs)
{
__cout << rhs.string;
return __cout;
}
istream &operator>>(istream &__cin, String &rhs)
{
__cin >> rhs.string;
rhs._length = rhs.strlen();
return __cin;
}
unsigned int String::strlen() const
{
int i;
for(i=0; *(string + i); ++i)
; /* Nothing */
return i;
}
const unsigned char String::at(unsigned int offset) const
{
return offset < _length ? *(string + offset) : char (0);
}
unsigned char &String::operator[](unsigned int offset)
{
if ((offset < _length) && (__ctoc_assgn_status()))
{
__ctoc_assgn_unlock();
return *(string + offset);
}
return const_cast<unsigned char &>(decoy_input);
}
unsigned char &String::operator[](unsigned int offset) const
{
if (offset < _length)
{
__ctoc_assgn_unlock();
return *(string + offset);
}
__ctoc_assgn_lock();
return const_cast<unsigned char &>(decoy_input);
}
int main()
{
String s;
cin >> s;
cout << s << endl;
cout << s.length() << endl;
cout << s.at(5) << endl;
cout << (int)s.at(1000) << endl;
s[3] = 'A';
cout << s << endl;
s[5] = s[2];
cout << s << endl;
s[2] = s[1000];
cout << s << endl;
cout << s[1000] << endl;
cin >> s;
return 0;
}
Errors are
131: Passing 'const String' as 'this' argument of void String::__ctoc_assgn_unlock() discards qualifiers.
sounds like the compiler is choking on something it's doing all by itself :rolleyes:
#include <iostream>
#include <string>
class String
{
public:
String();
String(const String &);
String(const String *);
String(const char *);
virtual ~String();
friend ostream &operator<< (ostream &, String &);
friend istream &operator>> (istream &, String &);
unsigned char &operator[](unsigned int);
unsigned char &operator[](unsigned int) const;
unsigned int length() const { return _length; }
const unsigned char at(unsigned int) const;
private:
unsigned char *string;
unsigned int _length;
unsigned char decoy_input;
unsigned int ctoc_assgn;
void __ctoc_assgn_lock() { ctoc_assgn = 0; }
void __ctoc_assgn_unlock() { ctoc_assgn = 1; }
unsigned int __ctoc_assgn_status() const { return ctoc_assgn; }
unsigned int strlen() const;
};
String::String()
{
string = new unsigned char;
string[0] = '\0';
_length = 0;
decoy_input = 0;
__ctoc_assgn_unlock();
}
String::String(const String &rhs)
{
this->_length = rhs.length();
for (int i=0; i < _length; ++i)
*(string + i) = rhs.at(i);
decoy_input = 0;
*(string + _length) = char (0);
__ctoc_assgn_unlock();
}
String::String(const String *rhs)
{
this->_length = rhs->length();
for (int i=0; i < _length; ++i)
*(string + i) = rhs->at(i);
decoy_input = 0;
*(string + _length) = char (0);
__ctoc_assgn_unlock();
}
String::String(const char *s)
{
int i;
for (i=0; s[i]; ++i)
*(string + i) = s[i];
decoy_input = 0;
*(string + _length) = char (0);
_length = i;
__ctoc_assgn_unlock();
}
String::~String()
{
delete [] string;
string = NULL;
_length = 0;
}
ostream &operator<<(ostream &__cout, String &rhs)
{
__cout << rhs.string;
return __cout;
}
istream &operator>>(istream &__cin, String &rhs)
{
__cin >> rhs.string;
rhs._length = rhs.strlen();
return __cin;
}
unsigned int String::strlen() const
{
int i;
for(i=0; *(string + i); ++i)
; /* Nothing */
return i;
}
const unsigned char String::at(unsigned int offset) const
{
return offset < _length ? *(string + offset) : char (0);
}
unsigned char &String::operator[](unsigned int offset)
{
if ((offset < _length) && (__ctoc_assgn_status()))
{
__ctoc_assgn_unlock();
return *(string + offset);
}
return const_cast<unsigned char &>(decoy_input);
}
unsigned char &String::operator[](unsigned int offset) const
{
if (offset < _length)
{
__ctoc_assgn_unlock();
return *(string + offset);
}
__ctoc_assgn_lock();
return const_cast<unsigned char &>(decoy_input);
}
int main()
{
String s;
cin >> s;
cout << s << endl;
cout << s.length() << endl;
cout << s.at(5) << endl;
cout << (int)s.at(1000) << endl;
s[3] = 'A';
cout << s << endl;
s[5] = s[2];
cout << s << endl;
s[2] = s[1000];
cout << s << endl;
cout << s[1000] << endl;
cin >> s;
return 0;
}
Errors are
131: Passing 'const String' as 'this' argument of void String::__ctoc_assgn_unlock() discards qualifiers.
sounds like the compiler is choking on something it's doing all by itself :rolleyes: