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 我会直接打电话给getMulti
。 const
在此实现中没有增加太多价值,因为数据以任何方式按值返回,并且外部用户无法更改它。另一方面,通过引用返回可以添加一些与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++ - 使用私有参数调用公共函数的主要内容,如果未能解决你的问题,请参考以下文章