Как сюда добавить проверку на равенство строк?

У меня не получается добавить ещё одну перезагрузку,пишет что "Слишком много параметров для этой функции оператора"


#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <iostream>
using namespace std;


class String       // Строка переменной длины
{
    char* str;   // Динамический массив символов
    int size;   // Длина строки

public:

    String& operator()(int, int); // Операция выделения подстроки

    String& operator==(string,string);//Вот здесь я пытаюсь сделать новую перезагрузку

    char  operator[](int);// Операция выделения символа
    
    void print()
    {
        if (str) cout << "Str = " << str << endl;
    }
    String(const char* s = "") {
        size = strlen(s) + 1;
        str = new char[size + 1];
        strcpy(str, s);
        str[strlen(s)] = '\0';
    }
    String(String& r) {
        str = new char[r.size];
        strcpy(str, r.str);
        size = r.size;
    }
};
String& String::operator()(int n1, int n2)
{
    size = n2 - n1 + 1;
    char* tmp = new char[size + 1];
    strncpy(tmp, (str + n1), size);
    tmp[size] = '\0';
    size++;
    delete[] str;
    str = new char[size];
    strcpy(str, tmp);
    delete[] tmp;
    return (*this);
}

String& String::operator==(string s1,string s2) //тут её реализовать
{

}

char String::operator[](int index)
{
    return (str[index]);
}


int main()
{
    String s1("HelloWorld");
    s1.print();
    String s2 = s1(2, 4);
    s2.print();
    s1.print();
    char ch = s1[1];
    cout << "ch = " << ch << endl;
    cin.get();
    return 0;


}



Ответы (2 шт):

Автор решения: AlexGlebe

во первых у вас аргументы из C++ библиотеки std::string, а вы должны сравнивать объекты собственного класса

// String& operator==(string,string);
String& operator==(String,String);

во вторых оператор должен возвращать не ссылку на объект, а логическое значение : правда / ложь.

bool operator==(String,String);

Аргументы и сам объект не должны изменятся, по-этому константность объекту и аргументы нужно выставлять обязательно.

bool operator==(String const,String const);

так как аргументы передаются как копии, желательно их передавать ссылкой, без лишнего копирования :

bool operator==(String const & ,String const & );

и наконец, этот оператор можно определить, как член класса :

class String {
  ..
  bool operator==(String const & x )const;
  ..
};

bool String::operator==(String const & x )const{
  return not strncmp(str,x.str,size);
}

так и статическим оператором :

class String {
  ..
  friend bool operator==(String const & th,String const & x );
  ..
};

bool operator==(String const & th,String const & x ){
  return not strncmp(th.str,x.str,th.size);
}
→ Ссылка
Автор решения: Тарас Атавин

А с какими двумя строками Вы собираетесь сравнивать? Условие-то хорошо себе представляете? if (s1==s2, s3) – это что? Если s1 равно и s2, и s3? Если s2 не равна s3, то это не возможно, а если нет, то нет смысла сравнивать s1 с обеими, так как s1 или равна обеим и это можно узнать, сравнив её с любой из строк, или не равна ни одной и это можно узнать, сравнив её с любой из строк. И зачем возвращать ссылку на объект? Что с ней иф делать будет?

bool String::operator==(const String &Right) const
{
 const char *l;
 const char *r;
 bool Result=true;
 if ((&Right)!=this)
 {
  if (size==(Right.size))
  {
   for (l=(((const char*)str)+size-1), r=(((const char *)(Right.str))+size-1); l>=((const char *)str); --l, --r)
   {
    if ((*l)!=(*r))
    {
     Result=false;
     break;
    }
   }
  }
  else
  {
   Result=false;
  }
 }
 return Result;
}

И причём здесь клавиша перезагрузки?

→ Ссылка