2010-10-29 2 views
12

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

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

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

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

Heinrich

ответ

23

Вам необходимо разыменования указателя первого.

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

Единственный путь это путь вы описали выше

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

3

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

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

+0

@sbi, спасибо. исправлено –

+0

(Обратите внимание, что «типы классов» включают структуры и объединения.) – sbi

+0

@sbi correct. структуры и союзы - это классы. Операторные функции рассматриваются, когда структуры и объединения являются операндами подходящего оператора, как для классов, объявленных с ключом класса. –

0

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

+2

Нет, семантически 'operator <<' должен возвращать аргумент левой стороны. –

10

Во-первых, придерживаться стандартных соглашений, ваш operator<< должен быть объявлен как это:

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

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

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

Это позволило бы такие утверждения, как:

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

aPointer << "this will not compile."; 

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

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

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

Смежные вопросы