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

Posted

技术标签:

【中文标题】c++ - 使用私有参数调用公共函数【英文标题】:c++ - Call public function with private arguments 【发布时间】:2013-04-23 15:16:13 【问题描述】:

在我的班级中:我想创建一个公共函数,该函数以班级的私有成员为参数。并且能够从类外部调用这个函数。

类似的东西:

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

【问题讨论】:

你不应该。 private 是专门为你什么都不想要的东西而设计的。如果这不是你想要的,它可能不应该是私有的。 你真正想做什么? any 成员的通用访问器?您采用的方法是错误的,在 MailToTerm 之外使用的 MailToTerm::cnter_multi_busy 不是 intWithMax 但有些令人困惑,我什至无法用简单的句子描述(&MailToTerm::cnter_multi_busy 是指向成员,但MailToTerm::cnter_multi_busy 只是一个限定名) 别这样。检查你的设计,你不应该外化私人成员。这就是为什么它们是私有的 @DavidRodríguez-dribeas 我想要一个通用函数,它给出传入参数的私有成员的最大值(类型:intWithMax) 这一切都不对。被告知你不想做你显然想做的事情可能会令人沮丧......但你应该倾听。 【参考方案1】:

我喜欢列举选项,像这样。它们可以很容易地用在 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);

【讨论】:

【参考方案2】:

我可能会做一个返回你真正想要的函数,例如:

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());

【讨论】:

您的第二个建议不太实用。删除getPrivMax 并直接使用getMulti 或其他任何内容。仅仅为了间接而做间接是不好的 抱歉,错过了一个常量。 @icepack 那么你会说用 const,他的第二个建议是正确的吗? @Gag 我会直接打电话给getMulticonst 在此实现中没有增加太多价值,因为数据以任何方式按值返回,并且外部用户无法更改它。另一方面,通过引用返回可以添加一些与const 结合的附加值:const intWithMax& getMulti() const return cnter_multi_busy; getPrivMax 参数也是如此 - 如果按值传递,const 没有意义【参考方案3】:

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

【讨论】:

【参考方案4】:

因此,您希望有一个对成员变量执行某些操作的函数,但希望在参数中指定哪个函数。我的解决方案是使用数组:

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

【讨论】:

【参考方案5】:
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();

【讨论】:

这如何帮助指定函数应该使用哪个私有成员?您所做的就是完全删除函数参数。 你会如何处理pt_MailToTerm->getPrivMax(MailToTerm::cnter_mono_busy); 如果他想暴露他的私有成员,他可以为每个成员编写一个公共的getter方法。 是的,我想要一些通用的东西

以上是关于c++ - 使用私有参数调用公共函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 构造函数重载 - 私有和公共

在 C++ 中调用私有方法

C++历史

JavaScript,在公共方法中将私有函数作为字符串调用,而不使用 eval(显示模式)

调用函数从类返回私有变量不起作用

c++ 类:在公共函数中使用私有数组?