Использование перегруженного оператора в функции друга - PullRequest
0 голосов
/ 01 мая 2020

для назначения мне нужно перегрузить оператор индекса [], чтобы вывести преобразованную версию номера тщеславия. Например, 1800STACKOVERFLOW будет преобразован в полезный номер телефона. Однако мне также необходимо перегрузить оператор вывода для вывода преобразования на консоль. Я думал, что смогу использовать свою перегруженную функцию индексации в моей перегруженной функции вывода, но это невозможно.

Это уменьшенная версия перегруженного оператора [] для моего класса:

string& newString::operator[](int i) {


        if (input[i] == "A" || input[i] == "B" || input[i] == "C") {
            input[i] = "2";
        }
        if (input[i] == "D" || input[i] == "F" || input[i] == "E") {
            input[i] = "3";
        }
        //continue this for all the letters

    return *input;
}

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

ostream& operator<<(ostream& o, const newString& p) {

    for (int i = 0; i < p.size; i++) {
        o << p.input[i];

    }
    o << endl;
    return o;
}

Моя основная очень проста:

#include"newString.h"

int main() {

    newString a;
    cin >> a;
    cout << a;


}

Однако я полагаю, что это может быть связано с тем, что функция ostream& является функцией друга. Я знаю, что мой перегруженный [] никогда не используется, потому что установка точки останова никогда не останавливает мою программу. У меня вопрос: поскольку я должен использовать эти перегрузки для вывода преобразования, как я могу go обойти эту проблему функции друга ostream&, не имея доступа к моей перегрузке []? На данный момент программа игнорирует перегрузку и выводит строку так же, как она была введена.

Несколько замечаний. Мой строковый объект ввода должен быть указателем в соответствии с требованиями. input и size являются приватными членами, а перегрузка [] является членом publi c, а ostream& - другом.

РЕДАКТИРОВАТЬ: Как предложено ниже, я изменил функцию operator<<();, чтобы использовать p[i] вместо p.input[i], потому что input является строковым типом, но мое определение использует тип newString, такой как p [i].


ostream& operator<<(ostream& o, const newString& p) {

    for (int i = 0; i < p.size; i++) {
        o << p[i] << endl;
    }

    return o;
}

, но есть ошибка для оператора [], потому что он пытается использовать тип newString в перегрузке оператора [] вместо i.

...