В хорошем коде классы никогда не запутываются. Это означает, что если класс B
использует класс A
, то класс A
не должен знать о B
.
Поэтому добавление дружбы - это просто обходной путь, который делает код запутанным.
Трудно сказать, что является лучшим подходом, не зная больше контекста, но есть пара возможностей.
Вы можете добавить такой API к A:
class A {
public:
void forEach(std::function<void(int)> f) const {
for(auto x : mData) {
f(x);
}
}
private:
list<int> mData;
};
class B {
public:
void displayContent(std::ostream &out) {
a.forEach([&out](int x){ out << x<< ", "; });
}
private:
A a;
};
Преимущество заключается в том, что вы можете многое изменить в A
(например, изменить список на вектор), и вам не нужно ничего исправлять в B
.
Есть больше возможностей. Простой получатель может решить проблему:
class A {
public:
list<int> getData() const {
return mData;
}
private:
list<int> mData;
};