Sky Wall

Разбираюсь с++ классы друзья и не компилируется..

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

Для объявления друга класса в C++ используется ключевое слово friend. Для этого необходимо указать имя класса или функции, которые нуждаются в доступе к закрытым членам.

class MyClass {
private:
  int myPrivateVar;
  void myPrivateFunction() {}
  friend class FriendClass;
};

В приведенном выше примере класс FriendClass объявлен как друг класса MyClass, что позволяет ему иметь доступ к закрытым членам этого класса.

Однако, при использовании дружественных классов, может возникнуть проблема компиляции. Рассмотрим следующий пример:

class MyClass {
private:
  int myPrivateVar;
  void myPrivateFunction() {}
  friend class FriendClass;
};

class FriendClass {
public:
  void friendFunction(MyClass& obj) {
    obj.myPrivateVar = 42;
    obj.myPrivateFunction();
  }
};

int main() {
  MyClass obj;
  FriendClass fc;
  fc.friendFunction(obj);
  return 0;
}

Однако, при компиляции такой код может выдать ошибку:

'void FriendClass::friendFunction(MyClass&)': cannot access private member declared in class 'MyClass'

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

Чтобы решить эту проблему, необходимо явно указать, что friendFunction является другом класса MyClass. Это можно сделать, добавив строку friend void FriendClass::friendFunction(MyClass& obj); в определение класса MyClass:

class MyClass {
private:
  int myPrivateVar;
  void myPrivateFunction() {}
  friend class FriendClass;
  friend void FriendClass::friendFunction(MyClass& obj);
};

class FriendClass {
public:
  void friendFunction(MyClass& obj) {
    obj.myPrivateVar = 42;
    obj.myPrivateFunction();
  }
};

int main() {
  MyClass obj;
  FriendClass fc;
  fc.friendFunction(obj);
  return 0;
}

Теперь код успешно скомпилируется и выполнится без ошибок.

Выводы

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