为 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空指针没有问题,strlen很快就会被销毁,所以你不用费心去重新设置它们。

对给定 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;