2013-04-23 8 views
0

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

Нечто подобное:

class MailToTerm 
{ 
    public: 
     MailToTerm(); 
     int getPrivMax(intWithMax priv) {return priv.getMax();} //my public function 
     void initPrivMax(intWithMax priv) {return priv.initMax();} 
     void getMutexObjPriv(intWithMax priv) {return priv.GetMutexObj();} 
     void relMutexObjPriv(intWithMax priv) {return priv.RelMutexObj();} 

    private: 
     intWithMax cnter_multi_busy ; 
     intWithMax cnter_mono_busy ; 
     intWithMax cnter_light_busy ; 
} 

int main(){ 
    MailToTerm* pt_MailToTerm = new MailToTerm(); 
    int multi = pt_MailToTerm->getPrivMax(MailToTerm::cnter_multi_busy); 
    int mono= pt_MailToTerm->getPrivMax(MailToTerm::cnter_mono_busy); 
} 

Это не работает, потому что cnter_multi_busy рассматривается как «частный», так что я не разрешен доступ к нему. Как мне это сделать?

+1

Вы не должны. 'private' специально для вещей, которые вам не нужны, кроме класса, с которым вы сталкиваетесь. Если это не то, что вы хотите, оно, вероятно, не должно быть частным. – cHao

+0

Что вы действительно хотите сделать? Общий доступ для * любого * члена? Подход, который вы принимаете, неверен, 'MailToTerm :: cnter_multi_busy', используемый вне' MailToTerm', является ** не ** 'intWithMax', но что-то запутанное, что я даже не могу описать в простом предложении (' & MailToTerm :: cnter_multi_busy' является указатель на член, но 'MailToTerm :: cnter_multi_busy' - это только квалифицированное имя) –

+0

Не делайте этого. Изучите свой дизайн, вы не должны экстернализировать частных членов. Вот почему они являются частными – SomeWittyUsername

ответ

1

я бы, вероятно, сделать функцию, которая возвращает то, что вы на самом деле хотите, такие как:

class MailToTerm 
{ 
    public: 
     MailToTerm(); 
     int getPrivMaxMulti() { return cnter_multi_busy.getMax(); } 
     // repeat for mono. 
    private: 
     intWithMax cnter_multi_busy ; 
     intWithMax cnter_mono_busy ; 
} 

В качестве альтернативы, вы могли бы, конечно, чтобы эти ценности общественности, но это, вероятно, не хорошая идея.

Другим решением является иметь функцию доступа для cnter_ ... частных членов, что-то вроде этого:

class MailToTerm 
{ 
    public: 
     MailToTerm(); 

     int getPrivMax(const intWithMax priv) {return priv.getMax();} //my public function 

     const intWithMax getMulti() const { return cnter_multi_busy; } 
     // ... as above for mono ... 
    private: 
     intWithMax cnter_multi_busy ; 
     intWithMax cnter_mono_busy ; 
} 

, а затем

int multi = pt_MailToTerm->getPrivMax(pt_MailToTerm->getMulti()); 
+1

Ваше второе предложение не слишком удобно. Бросьте 'getPrivMax' и используйте' getMulti' или что-то другое. Выполнение косвенности только ради косвенности является плохим. – SomeWittyUsername

+0

Простите, пропустил const. –

+0

@icepack Итак, вы сказали бы, что с const, его второе предложение правильное? – Gag

1

Вы можете либо сделать публичные члены, либо сделать общедоступную функцию-обертку, которая вызывает исходную функцию и передает частные члены.

0
class MailToTerm 
{ 
    public: 
     MailToTerm(); 
     int getPrivMax() {return cnter_multi_busy.getMax();} //my public function 

    private: 
     intWithMax cnter_multi_busy ; 
     intWithMax cnter_mono_busy ; 
} 

int main(){ 
    MailToTerm* pt_MailToTerm = new MailToTerm(); 
    int multi = pt_MailToTerm->getPrivMax(); 
} 
+0

Как это помогает указать, какой частный член должен использовать функция? Все, что вы сделали, полностью удаляет аргумент функции. –

+0

И как бы вы это сделали для 'pt_MailToTerm-> getPrivMax (MailToTerm :: cnter_mono_busy);'? – SomeWittyUsername

+0

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

2

Мне нравится перечислять варианты, например. Они могут быть легко использованы в операторах if/else или switch, и их легко расширить, если позже добавить дополнительные опции. Он также прекрасно скрывает реализацию и частных членов. Кроме того, перечисления могут использоваться как индексы в массиве с intWithMax: s, если это требуется.

class MailToTerm 
{ 
    public: 
     enum Options { // or some better name, of course 
      CENTER_MULTI_BUSY = 0, 
      CENTER_MONO_BUSY 
     }; 
     MailToTerm(); 
     int getPrivMax(Options o) { 
      if (o == CENTER_MULTI_BUSY) return cnter_multi_busy.getMax(); 
      else if (o == CENTER_MONO_BUSY) return cnter_mono_busy.getMax(); 
      else // do some error handling 
     } 

    private: 
     intWithMax cnter_multi_busy ; 
     intWithMax cnter_mono_busy ; 
} 

int main() { 
    MailToTerm* pt_MailToTerm = new MailToTerm(); 
    int multi = pt_MailToTerm->getPrivMax(MailToTerm::CENTER_MULTI_BUSY); 
} 
1

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

class MailToTerm 
{ 
    public: 
     enum MemberIndex { 
      CNTER_MULTI_BUSY = 0, 
      CNTER_MONO_BUSY = 1 
     }; 

     MailToTerm(); 
     int getPrivMax(MemberIndex index) {return cnter_busy[(int) index].getMax();} 

    private: 
     intWithMax cnter_busy[2]; 
}; 

Тогда называют это так:

pt_MailToTerm->getPrivMax(MailToTerm::CNTER_MULTI_BUSY); 
Смежные вопросы