[英]c++ - Call public function with private arguments
在我的課堂上:我想創建一個公共函數,該函數具有該類的私有成員作為參數。 並可以從類外部調用此函數。
像這樣:
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被視為“私有”,因此不允許我訪問它。 我應該怎么做?
我喜歡列舉這樣的選項。 它們可以輕松地在if / else或switch語句中使用,並且如果以后添加更多選項,則很容易擴展。 它還很好地隱藏了實現和私有成員。 另外,如果需要,可以將枚舉用作intWithMax
:s數組中的intWithMax
。
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);
}
您可以使成員成為公共成員,也可以使公共包裝函數調用原始函數並傳遞私有成員。
我可能會制作一個返回您實際想要的功能的函數,例如:
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());
因此,您想擁有一個對成員變量執行某些操作的函數,但希望在參數中指定哪個函數。 我的解決方案是使用數組:
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);
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.