Перегрузка побитового оператора And (&) и «* this» в функциях класса

0

У меня есть несколько вопросов об этом конкретном фрагменте кода. Я должен сначала упомянуть, что pChar всегда будет массивом динамических символов, который изменяется по мере необходимости методами, которые я не перечислял. Я просмотрел свое справочное руководство и этот сайт, но, похоже, не может получить четкое представление о том, как оператор & работает полностью. Я также не хочу использовать альтернативу, поскольку это назначение, и мне не разрешено. Я был в этом в течение нескольких дней, поэтому любая помощь была бы оценена.

  1. Что именно *this указывает на использование оператора &? Я предполагал, что это указывает на левый операнд.

  2. Если это не так, как мне получить доступ к левому операнду в методе & operator?

  3. Если все это полностью неверно, как я могу достичь желаемого результата, используя перегруженный 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;
}
  • 0
    Итак, вы знаете, нет справочного оператора. & используется для объявления ссылки, а также как оператора адреса и побитового оператора AND. Ссылки не являются указателями, поэтому они ни на что не указывают, и, следовательно, *this ни на что не указывает.
  • 1
    Это не справочный оператор. Это битовый оператор AND ... Оператор ссылки не принимает аргументов.
Показать ещё 4 комментария
Теги:
operator-overloading
this

1 ответ

1
Лучший ответ
  1. *this относится к левому операнду. this указывает на левый операнд.

  2. N/A

  3. Прекратите возвращать ссылку на локальный объект. 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, вам нужно будет добавить проверки для этого.

  • 1
    Спасибо @MattMcNabb. Я не понимал, что деструктор был вызван для локальной переменной до того, как возвращаемое значение могло быть назначено. Я ценю разъяснения и очень ясный и лаконичный способ, которым вы ответили на все мои вопросы, и, в частности, «этот» разгром, который я пережил. Ты лучший.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню