У меня есть несколько вопросов об этом конкретном фрагменте кода. Я должен сначала упомянуть, что pChar
всегда будет массивом динамических символов, который изменяется по мере необходимости методами, которые я не перечислял. Я просмотрел свое справочное руководство и этот сайт, но, похоже, не может получить четкое представление о том, как оператор & работает полностью. Я также не хочу использовать альтернативу, поскольку это назначение, и мне не разрешено. Я был в этом в течение нескольких дней, поэтому любая помощь была бы оценена.
Что именно *this
указывает на использование оператора &? Я предполагал, что это указывает на левый операнд.
Если это не так, как мне получить доступ к левому операнду в методе & operator?
Если все это полностью неверно, как я могу достичь желаемого результата, используя перегруженный operator&
?
Метод для & оператора:
PDS_String & PDS_String::operator & (const PDS_String & Str)const
{
PDS_String temp(*this);
strcat(temp.pChar, Str.pChar);
return temp;
}
Главный:
void main ()
{
PDS_String String1;
PDS_String String2;
PDS_String String3;
String1 = "monkey";
String2 = "chicken";
String3 = String1 & String2;
// Desired outcome for String3 is "monkeychicken"
}
Класс:
class PDS_String
{
public:
PDS_String(); //Default
PDS_String(const PDS_String &); //Copy
~PDS_String(); //Destructor
char * operator & (const PDS_String &) const; // Concatenation
PDS_String & operator = (const char *); // Assignment
// I haven't listed all methods and operator overloads
private:
char * pChar;
long NumChars;
long NumSlots;
};
Метод оператора присваивания:
PDS_String & PDS_String::operator = (const char * Str)
{
if (pChar == Str)
return *this;
else
{
if (NumSlots < strlen(Str))
{
delete[] pChar;
pChar = new char[(strlen(Str) + 1)];
NumSlots = (strlen(Str));
}
else;
}
strcpy(pChar, Str);
NumChars = strlen(Str);
return *this;
}
Большое спасибо Мэтту Макнаббу. Я изменил оператор и метод, чтобы отразить ваше предложение:
char * PDS_String::operator & (const PDS_String & Str)const
{
char * temp;
temp = new char[strlen(pChar)+strlen(Str.pChar)+1];
temp = pChar;
strcat(pChar, Str.pChar);
return temp;
}
*this
относится к левому операнду. this
указывает на левый операнд.
N/A
Прекратите возвращать ссылку на локальный объект. temp
перестает существовать, когда функция заканчивается, поэтому вызывающая сторона имеет обвисшую ссылку (вызывая неопределенное поведение).
Нормальная семантика для двоичного оператора - вернуть объект по значению. Таким образом, вы можете перейти на PDS_String PDS_String::operator & (const PDS_String & Str)const
и все будет хорошо.
Обычно, что сделано, что operator+=
функция является функцией-членом, которая меняет *this
, а затем у вас есть свободная функция X operator+(X x1, X x2) { return x1 += x2; }
X operator+(X x1, X x2) { return x1 += x2; }
. Вы можете сделать то же самое с operator&
и operator&=
.
У вас также нет защиты от кого-то, кто пытается конкатенировать длинную строку и переполнять, но сколько памяти выделяется pChar
, вам нужно будет добавить проверки для этого.
&
используется для объявления ссылки, а также как оператора адреса и побитового оператора AND. Ссылки не являются указателями, поэтому они ни на что не указывают, и, следовательно,*this
ни на что не указывает.