c ++ вызывает приватную функцию в классе контейнера

0

Если у меня есть два класса:

class worker
{
   Top *mp_parent;

   worker(Top *parent) : mp_parent(parent) {};

   int doSomeWork()
   {
      int i = mp_parent->privateFunction(); // This is the function I want to call
   }
}

class Top
{
   private:
   worker m_Worker;

   int privateFunction() {return 1;}

}

Где Top класс содержит экземпляр рабочего класса. Когда создается экземпляр рабочего объекта, передается указатель на родительский класс. Позже вызывается функция doSomeWork(), которая должна получать значение от родителя, поэтому вызывает mp_parent-> privateFunction().

Каков наилучший способ достичь этого? - Я не хочу, чтобы privateFunction() публичная функция, если я могу ее избежать, но она не работает, поскольку она является частной: o

Есть ли другие варианты?

  • 2
    Сделать Топ другом работника. Также можно сделать рабочий вложенным классом в Top.
  • 1
    Сначала устраните круговую зависимость.
Показать ещё 6 комментариев
Теги:

2 ответа

1

Возможно, вы можете использовать ключевое слово "friend":

class worker
{
   Top *mp_parent;

   worker(Top *parent) : mp_parent(parent) {};

   int doSomeWork()
   {
      int i = mp_parent->privateFunction(); // This is the function I want to call
   }
}

class Top
{
   friend class worker;
   private:
   worker m_Worker;

   int privateFunction() {return 1;}

}
  • 0
    Да, это то, что я хочу, спасибо :)
0

Это классическое использование друзей:

class Top
{
   private:
   friend class Worker;
   worker m_Worker;

   int privateFunction() {return 1;}

}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню