'overload array operator for mystring class

I need help figuring out how to overload the array operator for a MyString class that I have to create. I already have everything else figured out, but the arrays are giving me trouble, for some reason.

Here is my header file:

#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

What would the body look like for MyString::operator []?

MyString MyString::operator [](MyString *)
{
    ... what goes here
}


Solution 1:[1]

 MyString MyString::operator [](MyString *)

That's not how you should typically use a subscript operator.

What do you expect when you are using the [] operator? By the way you declared it, you are using a string pointer as argument, and receiving a string as return.

Usually, you pass an index type (commonly an unsigned-integer like size_t) and return the character at that position. If that's what you want, you should do something along these lines:

 char& MyString::operator [](size_t position)
 {
     // some error handling
     return str[position];
 }
 
 char MyString::operator [](size_t position) const { /* ... */ }

For overall guidelines on overloading operators, take a look at What are the basic rules and idioms for operator overloading?.

Also, I would point out that your destructor is a bit odd:

if (len != 0)
    delete [] str;
    str = 0;
    len = 0;

Your indentation level suggests that you expect everything to happen inside the if statement, but only the first one will. That is not particularly dangerous in this case, because only the delete would suffice.

There is no problem in deleteing a null pointer, and str and len will be destroyed shortly after, so you don't have to bother resetting them.

Solution 2:[2]

The syntax for using the array operator with an object of the given class is:

MyString s("Test");
char c = s[0];

The argument to the function is an integral value.

Hence, the operator needs to be declared as:

// 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;

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Remy Lebeau
Solution 2 R Sahu