是否有必要在友方功能中使用访问器?

时间:2012-10-18 16:38:21

标签: c++ friend-function

这是班级

class Instructor
{
 public:

Instructor ( int id , string name ) ;// constructor
 ~Instructor ()                       ;

// methods
string               getName           () ;
int                  getID             () ;



private:

int                  id             ;
string               name           ;

friend ostream & operator<< ( ostream & out , Instructor & instructor ) ;
 } ;

这是ostream函数

 ostream & operator<< ( ostream & out , Instructor & instructor )
{
out <<  "ID:" << instructor.getID() << "\t  NAME:" << instructor.getName() << "\t OFFERED_COURSES:" ;


return out << endl ;

}

这里是getname和getID方法

  string Instructor::getName ()
{
  return this->name ;
}


int Instructor::getID ()
{
  return this->id ;
}

我的问题是为什么我们需要使用getID和getname函数。我们不能通过写“this-&gt; name”来访问名称吗?谢谢你的回答。

4 个答案:

答案 0 :(得分:4)

必要否,建议是。事实上,根本不需要声明friend,这是更加封装的。

答案 1 :(得分:3)

可能不是“不能”不应该“不应该”。在这个时刻,getID()只是返回基础变量,但不能保证它不会改变为不同的表示。遇到封装时要尊重封装。

答案 2 :(得分:0)

你可以这样做(直接在朋友的功能中访问私人会员),但这不是最好的办法。使用检查器函数,因为它们应该被编写为以编写类的方式公开类的私有状态以使其在外部使用。实际的私有字段用于类使用它自己做内部需要的事情

因为您在操作员功能中没有使用私人会员,所以您甚至不需要它成为朋友。

答案 3 :(得分:0)

不,朋友真的是你班级实施的延伸部分,因此可以直接访问它。

如果您已将某个函数或类声明为不属于其实现细节的朋友,则可能是朋友使用不当。

在你的情况下,你实际上可以完全删除流媒体朋友的重载,但是如果你决定你的类也支持流媒体,并且不想也支持setter功能(或交换),你将留下只剩下让你的朋友作为朋友直接写成员变量的选项。

(请注意,如果流入失败,则应将对象保留为默认(新构建)状态。

stream-out应该是朋友,当(并且最好只在什么时候)需要写入您通常不会直接访问的流成员时。