Перегрузка оператора >> - PullRequest
0 голосов
/ 07 мая 2009

Я новичок в перегрузке операторов C ++ и у меня возникли проблемы с прорезыванием зубов.

Я определил:

void Graph :: operator >> (const char * param)

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

Ответы [ 4 ]

3 голосов
/ 07 мая 2009

Если вы хотите определить оператор, чтобы вы могли сделать:

cin >> myGraph
cout << myGraph

Вам нужно сделать что-то вроде этого примера ниже:

struct Entry
{
    string symbol;
    string original;
    string currency;

    Entry() {}
    ~Entry() {}
    Entry(string& symbol, string& original, string& currency)
        : symbol(symbol), original(original), currency(currency)
    {}
    Entry(const Entry& e)
        : symbol(e.symbol), original(e.original), currency(e.currency)
    {}
};


istream& operator>>(istream& is, Entry& en);
ostream& operator<<(ostream& os, const Entry& en);

Затем реализуйте операторы:

istream& operator>>(istream& is, Entry& en)
{
    is >> en.symbol;
    is >> en.original;
    is >> en.currency;
    return is;
}

ostream& operator<<(ostream& os, const Entry& en)
{
    os << en.symbol << " " << en.original << " " << en.currency;
    return os;
}

Примечание: в этом случае Entry является структурой, поэтому ее члены являются открытыми. Если вы не хотите делать их общедоступными, вы можете определить методы оператора как друзей, чтобы они могли получить доступ к закрытым членам Entry.

Вот как бы выглядел Entry, если бы его участники не были публичными:

struct Entry
{
    private:
        string symbol;
        string original;
        string currency;

    public:
        Entry() {}
        ~Entry() {}
        Entry(string& symbol, string& original, string& currency)
            : symbol(symbol), original(original), currency(currency)
        {}
        Entry(const Entry& e)
            : symbol(e.symbol), original(e.original), currency(e.currency)
        {}

        friend istream& operator>>(istream& is, Entry& en);
        friend ostream& operator<<(ostream& os, const Entry& en);
};
2 голосов
/ 07 мая 2009
Graph myGraph;
myGraph >> "bla";

Обратите внимание, что ваше странное использование operator>>(). Обычно он используется так:

NumericObject NumericObject::operator>>(NumericObject const& operand) const;
// bitshifts to the right

и

std::istream& operator>>(istream& in, StreamableObject& obj);
// parses a string representation of obj
1 голос
/ 07 мая 2009

Я предполагаю, что вы на самом деле пытаетесь написать код вроде этого:

cin >> myGraph;
cout << myGraph;

Обратите внимание, что графический объект на самом деле не является объектом, вызывающим метод.

В этом случае вы действительно хотите перегрузить глобальный оператор >> функции:

std::istream& operator>> (std::istream&, graph&);
std::ostream& operator<< (std::ostream&, const graph&);
0 голосов
/ 07 мая 2009

Если вы новичок в этом, вы выбрали довольно интересную (читаемую как «не простая») проблему, чтобы попытаться ее решить.

Перегрузки оператора не совсем функции. Они вызываются косвенно, когда компилятор пытается разрешить код, который выглядит примерно так:

Graph g = new Graph();
g >> "do something";

Я рекомендую вам НЕ делать этого. Перегрузка оператора может привести к ОЧЕНЬ сложным ошибкам, которые необходимо устранить благодаря побочным эффектам. Они также несут ответственность за каждого, кто должен поддерживать ваш код (это может быть вы после того, как забыли, почему вы это сделали).

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

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