Использование перегруженных операторов в указателях - PullRequest
13 голосов
/ 29 октября 2010

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

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

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

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

Генрих

Ответы [ 4 ]

23 голосов
/ 29 октября 2010

Сначала необходимо разыменовать указатель.

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

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

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

12 голосов
/ 29 октября 2010

Прежде всего, чтобы придерживаться стандартных соглашений, ваш 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 голосов
/ 29 октября 2010

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

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

0 голосов
/ 29 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...