在我的课堂上:我想创建一个公共函数,它具有类的私有成员作为参数。并且能够从课堂外调用此函数。
类似的东西:
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被视为“私有”,所以我不允许访问它。 我该怎么办?
答案 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();
}