Подтвердить что ты не робот

Использование перегруженных операторов по указателям

Я перегрузил < оператора класса. Как мне перегрузить оператор, если я хочу использовать его в указателях, например:

class A {
    std::string operator<<(std::string&);
}

aInst << "This works";
aPointer << "This doesnt work";
aPointer->operator<<("Whereas this works but is useless");

Надеюсь, ты поможешь мне.

Heinrich

4b9b3361

Ответ 1

Вам нужно сначала разыменовать указатель.

A *ptr = new A();
(*ptr) << "Something";

Единственный способ - это то, как вы описали выше

Изменить: решение Андре ниже доступно для работы, но, как он сказал, это может быть не очень хорошая идея.

Ответ 2

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

class A {
    A& operator<<(const std::string&);
};

Теперь, технически, вы могли бы достичь части того, что вы хотите, реализовав следующую глобальную функцию:

A * operator<< ( A * a, const std::string& s ) { (*a) << s; return a; }

Это позволит использовать такие выражения, как:

string s = "this will be printed."; aPointer << s;
aPointer << string("this will be printed");

Однако вы не сможете написать следующее:

aPointer << "this will not compile.";

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

(*aPointer) << "this will be printed.";

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

Ответ 3

Вы не можете этого сделать. Функции оператора рассматриваются только для операндов, которые имеют перечисление или типы классов среди них.

Вы ведь меняете указатель, но не класс. Вам нужно явно указать, что вы хотите перейти в объект класса, сначала разыгрывая указатель.

Ответ 4

Обычно нет оснований для этого, потому что семантически оператор < < вернуть ссылку на объект потока. И технически вы в принципе не можете этого сделать.