为 mystring class 重载数组运算符
overload array operator for mystring class
我需要帮助弄清楚如何为我必须创建的 MyString
class 重载数组运算符。我已经把其他一切都弄清楚了,但是出于某种原因,数组给我带来了麻烦。
这是我的 header 文件:
#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <cstring> // For string library functions
#include <cstdlib> // For exit() function
using namespace std;
// MyString class: An abstract data type for handling strings
class MyString
{
private:
char *str;
int len;
public:
// Default constructor.
MyString()
{
str = 0;
len = 0;
}
// Convert and copy constructors.
MyString(char *);
MyString(MyString &);
// Destructor.
~MyString()
{
if (len != 0)
delete [] str;
str = 0;
len = 0;
}
// Various member functions and operators.
int length() { return len; }
char *getValue() { return str; };
MyString operator+=(MyString &);
MyString operator+=(const char *);
MyString operator=(MyString &);
MyString operator=(const char *);
bool operator==(MyString &);
bool operator==(const char *);
bool operator!=(MyString &);
bool operator!=(const char *);
bool operator>(MyString &);
bool operator>(const char *);
bool operator<(MyString &);
bool operator<(const char *);
bool operator>=(MyString &);
bool operator>=(const char*);
bool operator<=(MyString &);
bool operator<=(const char *);
MyString operator [](MyString *);
// Overload insertion and extraction operators.
friend ostream &operator<<(ostream &, MyString &);
friend istream &operator>>(istream &, MyString &);
};
#endif
对于 MyString::operator []
,body 会是什么样子?
MyString MyString::operator [](MyString *)
{
... what goes here
}
MyString MyString::operator [](MyString *)
这不是通常使用下标运算符的方式。
当您使用 []
运算符时,您期望得到什么?通过声明它的方式,您使用字符串指针作为参数,并接收一个字符串作为 return.
通常,您传递索引类型(通常是无符号整数,如 size_t
)和 return 该位置的 字符 。如果那是你想要的,你应该按照以下方式做一些事情:
char& MyString::operator [](size_t position)
{
// some error handling
return str[position];
}
char MyString::operator [](size_t position) const { /* ... */ }
有关重载运算符的总体指南,请查看 What are the basic rules and idioms for operator overloading?。
另外,我要指出你的析构函数有点奇怪:
if (len != 0)
delete [] str;
str = 0;
len = 0;
您的缩进级别表明您希望一切都发生在 if
语句内,但只有第一个会发生。在这种情况下,这并不是特别危险,因为只有 delete
就足够了。
delete
空指针没有问题,str
和len
很快就会被销毁,所以你不用费心去重新设置它们。
对给定 class 的对象使用数组运算符的语法是:
MyString s("Test");
char c = s[0];
函数的参数是一个整数值。
因此,运算符需要声明为:
// The non-const version allows you to change the
// content using the array operator.
char& operator [](size_t index);
// The nconst version allows you to just get the
// content using the array operator.
char operator [](size_t index) const;
我需要帮助弄清楚如何为我必须创建的 MyString
class 重载数组运算符。我已经把其他一切都弄清楚了,但是出于某种原因,数组给我带来了麻烦。
这是我的 header 文件:
#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <cstring> // For string library functions
#include <cstdlib> // For exit() function
using namespace std;
// MyString class: An abstract data type for handling strings
class MyString
{
private:
char *str;
int len;
public:
// Default constructor.
MyString()
{
str = 0;
len = 0;
}
// Convert and copy constructors.
MyString(char *);
MyString(MyString &);
// Destructor.
~MyString()
{
if (len != 0)
delete [] str;
str = 0;
len = 0;
}
// Various member functions and operators.
int length() { return len; }
char *getValue() { return str; };
MyString operator+=(MyString &);
MyString operator+=(const char *);
MyString operator=(MyString &);
MyString operator=(const char *);
bool operator==(MyString &);
bool operator==(const char *);
bool operator!=(MyString &);
bool operator!=(const char *);
bool operator>(MyString &);
bool operator>(const char *);
bool operator<(MyString &);
bool operator<(const char *);
bool operator>=(MyString &);
bool operator>=(const char*);
bool operator<=(MyString &);
bool operator<=(const char *);
MyString operator [](MyString *);
// Overload insertion and extraction operators.
friend ostream &operator<<(ostream &, MyString &);
friend istream &operator>>(istream &, MyString &);
};
#endif
对于 MyString::operator []
,body 会是什么样子?
MyString MyString::operator [](MyString *)
{
... what goes here
}
MyString MyString::operator [](MyString *)
这不是通常使用下标运算符的方式。
当您使用 []
运算符时,您期望得到什么?通过声明它的方式,您使用字符串指针作为参数,并接收一个字符串作为 return.
通常,您传递索引类型(通常是无符号整数,如 size_t
)和 return 该位置的 字符 。如果那是你想要的,你应该按照以下方式做一些事情:
char& MyString::operator [](size_t position)
{
// some error handling
return str[position];
}
char MyString::operator [](size_t position) const { /* ... */ }
有关重载运算符的总体指南,请查看 What are the basic rules and idioms for operator overloading?。
另外,我要指出你的析构函数有点奇怪:
if (len != 0)
delete [] str;
str = 0;
len = 0;
您的缩进级别表明您希望一切都发生在 if
语句内,但只有第一个会发生。在这种情况下,这并不是特别危险,因为只有 delete
就足够了。
delete
空指针没有问题,str
和len
很快就会被销毁,所以你不用费心去重新设置它们。
对给定 class 的对象使用数组运算符的语法是:
MyString s("Test");
char c = s[0];
函数的参数是一个整数值。
因此,运算符需要声明为:
// The non-const version allows you to change the
// content using the array operator.
char& operator [](size_t index);
// The nconst version allows you to just get the
// content using the array operator.
char operator [](size_t index) const;