отношение между классами

317
18 января 2018, 21:15

Можно ли в классе С выполнить расчет int a / int b и записать результат в переменную класса С int c?

class A {
  int a = 5;
};
class B {
  int b = 10;
};
class C {
  friend class A;
  friend class B;
  int c;
};
Answer 1

Если вас интересует тот вопрос, может ли дружественный класс использовать закрытые имена классов, чьим другом он является, то да - например так:

#include <iostream>
using  std::cout;
class C;     // вначале обьявите 
class A {
   friend class C;
   int a;
public:
   A() : a(10) { } // в конструкторе инициализировать, а не так как вы сделали
   };
   class B {
     friend class C;
       int b;
   public:
       B() : b(5) {}
   };
   class C {
       int c;  // с это не C, поэтому можно
   public:
       C()  { A t; B k; c = t.a/k.b;}  // нужно создавать обьекты типов
       int get_res() const { return c; }
   };

int main()
{       
    C g;
    std::cout << g.get_res();
    return 0;
}
Answer 2

Понимаете, если я скажу, что вы мой друг - вы же меня от моего заявления не пустите к себе переночевать?

А вот я вроде как должен, раз заявил, что вы мой друг...

Вот так и у вас - класс C заявил, что он - друг A и B, так что он им доверяет свои внутренности :) А они ему такое доверие не высказали.

Согласитесь, было бы слишком небезопасно - так любой класс, любая функция могли бы получить доступ к любым запрятанным полям - просто объявив о своем желании...

Answer 3

В вашем примере нет никакого a и нет никакого b.

В вашем примере есть только нестатические поля классов A::a и B::b. Нестатические поля классов не существуют физически сами по себе. Нестатические поля классов существуют только внутри объектов (экземпляров) этих классов, только вместе с этими объектами. Поэтому, пока вы не создадите объекты этих классов, никаких a и b не будет.

Если у вас на руках есть экземпляр aa класса A и экземпляр bb класса B, то вы, при наличии соответствующих прав доступа, сможете запросто вычислить значение aa.a / bb.b. Но пока у вас нет таких экземпляров, то и говорить не о чем, ибо никаких a и b не существует.

У вас в коде я не вижу ни малейшего намека то, что класс C работает с какими-то экземплярами классов A и B. А без экземпляров ни о каких a и b и говорить не приходится.

READ ALSO
Перегрузка оператора в классе

Перегрузка оператора в классе

Не получается перегрузить оператор сравнения "<"Использую Qt

329
Вывод данных в виде таблицы в консоле

Вывод данных в виде таблицы в консоле

как мне это вывести таблицей в консоле?

193
&ldquo;Name of project&rdquo; has triggered a breakpoint

“Name of project” has triggered a breakpoint

Проблема была описанна выше) Смысл программы, что бы находить самое длинное слово 1 строки, которое должно содержаться в 2 других строкахВсе...

222
Ошибка с condition variable. c++

Ошибка с condition variable. c++

Не работает этот код:

236