1

这是课程

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->name”来访问名称吗?感谢您的回答。

4

4 回答 4

4

必要不,推荐是。其实根本不需要声明friend,更加封装了。

于 2012-10-18T16:40:17.740 回答
3

与其说是“不能”,不如说是“不应该”。此时此刻,getID()只是返回底层变量,但不能保证它不会更改为不同的表示形式。当你遇到它时,尊重封装。

于 2012-10-18T16:41:33.407 回答
0

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

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

于 2012-10-18T16:41:53.523 回答
0

不,朋友实际上是您的类实现的扩展部分,因此可以直接访问它。

如果您将函数或类声明为不属于其实现细节的友元,那可能是对友元的错误使用。

在您的情况下,您实际上可以完全删除流媒体好友重载,但是如果您决定您的类也支持流式传输,并且不想也支持 setter 函数(或交换),那么您将剩下唯一的选择让您的流作为朋友直接写入成员变量。

(请注意,如果流入失败,则应使对象处于默认(新建)状态。

当(最好仅在)需要写入您通常不会直接访问的流成员时,流出应该是朋友。

于 2012-10-18T16:46:36.923 回答