C++ - 使用私有参数调用公共函数
在我的类中:我想创建一个公共函数,该函数具有该类的私有成员的参数。并且能够从课外调用这个功能。C++ - 使用私有参数调用公共函数
类似的东西:
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被看作是“私人”,所以我不能访问它。 我该怎么办?
我可能会作出这样的返回你真正想要的功能,如:
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'或其他。只为了间接而做间接是不好的 – SomeWittyUsername 2013-04-23 15:26:49
对不起,错过了一个const。 – 2013-04-23 15:30:25
@icepack所以你会说,与const,他的第二个建议是正确的? – Gag 2013-04-23 15:35:26
您可以将其成员公开,也可以创建一个公共包装函数,该函数调用原始函数并传递私有成员。
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();
}
这有助于指定函数应该使用哪个私有成员?你所做的全部就是删除函数参数。 – 2013-04-23 15:21:26
你会怎么做'pt_MailToTerm-> getPrivMax(MailToTerm :: cnter_mono_busy);'? – SomeWittyUsername 2013-04-23 15:21:34
如果他想揭露他的私人成员,他可以为每一个人写一个公开的getter方法。 – countfromzero 2013-04-23 15:22:49
我喜欢列举选项,像这样。它们可以用于if/else或轻松切换语句,并且如果稍后添加更多选项,则很容易扩展。它也很好地隐藏了实现和私有成员。另外,如果需要,枚举可以用作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);
}
所以,你想有,做一些与功能一个成员变量,但想要指定参数中的哪一个。我的解决办法是使用数组:
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);
你不应该。 'private'专门用于你不想要的东西,但是课堂上正在进行。如果这不是你想要的,它可能不应该是私人的。 – cHao 2013-04-23 15:20:28
你真的想做什么? *任何*成员的通用访问者?你所采取的方法是错误的,在MailToTerm之外使用的'MailToTerm :: cnter_multi_busy'是**而不是'intWithMax',但是我甚至无法用简单的语句描述('&MailToTerm :: cnter_multi_busy')一个指向成员的指针,但是'MailToTerm :: cnter_multi_busy'只是一个合格的名字) – 2013-04-23 15:22:33
不要这么做。检查你的设计,你不应该私有化私人成员。这就是为什么他们是私人的 – SomeWittyUsername 2013-04-23 15:22:46