Какая польза от функции друга в структуре? - PullRequest
0 голосов
/ 15 января 2019

Я перегружаю оператор вставки (<<) внутри структуры, используя следующий синтаксис: </p>

struct Address{
    string street;
    string cross;
    int suite;

    friend ostream &operator <<(ostream &oss, const Address &other){
        oss<<"street: "<<other.street<<"cross: "<<other.cross<<"suite: "<<other.suite;
        return oss;
    }
};

Я вижу, что только если я объявляю функцию другом структуры struct 'Address', мой код компилируется. Насколько я понимаю, функция «друг» полезна, когда нужно получить доступ к закрытым членам класса. Но, поскольку в структуре все члены являются открытыми, не должно быть необходимости объявлять оператор «<<» в качестве друга. </p>

Может ли кто-нибудь прояснить необходимость объявления оператора '<<' здесь как друга структуры 'Address'? </p>

1 Ответ

0 голосов
/ 15 января 2019

Действительно, этот оператор может быть определен в области имен без friend.

Вам не «нужно» делать это friend в этом случае, именно по тем причинам, которые вы приводите, поэтому неясно, откуда вы слышали, что делаете!

struct Address
{
   string street;
   string cross;
   int suite;
};

inline ostream& operator<<(ostream& oss, const Address& other)
{
   oss << "street: " << other.street << "cross: " << other.cross << "suite: " << other.suite;
   return oss;
}

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

Однако класс, определенный с помощью struct, по-прежнему является просто классом и все еще может содержать private членов. Если бы у вас был тот, который сделал, вам снова понадобится friend.

Некоторые люди могут всегда сделать friend функцию для согласованности, чтобы определение operator<< выглядело как «в» классе, когда вы читаете его. В качестве альтернативы могут быть некоторые загадочные ограничения поиска, которые делают это удобным (так как определенная таким образом функция friend может быть найдена только ADL), хотя я не могу думать ни о чем из головы.

...