簡體   English   中英

用私有參數調用公共函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM