Как сюда добавить проверку на равенство строк?
У меня не получается добавить ещё одну перезагрузку,пишет что "Слишком много параметров для этой функции оператора"
#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 шт):
во первых у вас аргументы из 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;
}
И причём здесь клавиша перезагрузки?