2013-04-23 241 views
0

在我的类中:我想创建一个公共函数,该函数具有该类的私有成员的参数。并且能够从课外调用这个功能。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被看作是“私人”,所以我不能访问它。 我该怎么办?

+1

你不应该。 'private'专门用于你不想要的东西,但是课堂上正在进行。如果这不是你想要的,它可能不应该是私人的。 – cHao 2013-04-23 15:20:28

+0

你真的想做什么? *任何*成员的通用访问者?你所采取的方法是错误的,在MailToTerm之外使用的'MailToTerm :: cnter_multi_busy'是**而不是'intWithMax',但是我甚至无法用简单的语句描述('&MailToTerm :: cnter_multi_busy')一个指向成员的指针,但是'MailToTerm :: cnter_multi_busy'只是一个合格的名字) – 2013-04-23 15:22:33

+0

不要这么做。检查你的设计,你不应该私有化私人成员。这就是为什么他们是私人的 – SomeWittyUsername 2013-04-23 15:22:46

回答

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

你的第二个建议不太实用。删除'getPrivMax'并直接使用'getMulti'或其他。只为了间接而做间接是不好的 – SomeWittyUsername 2013-04-23 15:26:49

+0

对不起,错过了一个const。 – 2013-04-23 15:30:25

+0

@icepack所以你会说,与const,他的第二个建议是正确的? – Gag 2013-04-23 15:35:26

1

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

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(); 
} 
+0

这有助于指定函数应该使用哪个私有成员?你所做的全部就是删除函数参数。 – 2013-04-23 15:21:26

+0

你会怎么做'pt_MailToTerm-> getPrivMax(MailToTerm :: cnter_mono_busy);'? – SomeWittyUsername 2013-04-23 15:21:34

+0

如果他想揭露他的私人成员,他可以为每一个人写一个公开的getter方法。 – countfromzero 2013-04-23 15:22:49

2

我喜欢列举选项,像这样。它们可以用于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); 
} 
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); 
相关问题