2014-11-11 2 views
0

Если у меня есть два класса:C++ называть частные функции в контейнерном классе

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

сначала устранить круговую зависимость. –

+0

@ KarolyHorvath да, извините, это всего лишь минимальный пример. Я не заботился о других вещах, чтобы описать проблему :) –

ответ

1

Может быть, вы можете использовать «друг» ключевое слова:

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;} 

} 

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

Смежные вопросы