c ++ - 使用私有参数调用公共函数

时间:2013-04-23 15:16:13

标签: c++ class function member

在我的课堂上:我想创建一个公共函数,它具有类的私有成员作为参数。并且能够从课堂外调用此函数。

类似的东西:

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被视为“私有”,所以我不允许访问它。 我该怎么办?

5 个答案:

答案 0 :(得分: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 :(得分:1)

您可以将成员设为公共,也可以创建一个公共包装函数来调用原始函数并传递私有成员。

答案 2 :(得分: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());

答案 3 :(得分: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);

答案 4 :(得分: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();
}