Где разместить общую функцию, которая будет использоваться классом и членом класса? - PullRequest
0 голосов
/ 07 июня 2018

Например,

class B {
  int* b1;
  int* b2;
  B(int* x, int* y) {
     b1 = x;
     b2 = y;
  }

};

class A {
  int* a1;
  int* a2;
  B* b1;
  public:
  A() {
    a1 = new int;
    a2 = new int;
    b1 = new B1(a1, b1);
  }
};

Я хочу получить доступ к значениям, указанным a1 и a2, из объектов обоих классов A и B. Где я должен написать функцию для того же самого, так что эта функция может быть вызванаобъектами А и объектами Б.?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

В этом особом контексте вы передаете только указатели, поэтому объекты, обозначенные a1 и a2 , являются объектами, указанными b1 и b2.С другой стороны, объект A знает, что он содержит B, но экземпляр B не знает, что содержится в A.

. Поэтому я думаю, чтофункция, управляющая указанными объектами, должна быть объявлена ​​в B классе.Тогда, если B является членом общедоступного API A (например, с геттером), достаточно:

class B {
    ...
    void do_something(...) {
        // do something with objects pointed by b1 and b2
    }
};
...
A a;
a.getB()->do_something();
...

Если B член A является реализацией деталь , вы должны объявить метод реле в A:

class A {
    ...
    void do_something(...) {     // delegate to the `B` member
        b1->do_something(...);
    }
};
...
A a;
a.do_something(...);
...
0 голосов
/ 07 июня 2018

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

Это позволяет "перекрестное использование" членов и методов

Если вы хотите, чтобы только одна функция обращалась к закрытым членам и методам A и B, вы можетеДруг этой конкретной функции.

...