2012-02-09 16 views
1

友人の機能が、フレンド機能はクラス内のプライベートデータを変更できますか?

のポインタを使用せずにオブジェクトのプライベートデータを変更してオブジェクトを送信できるかどうかを知りたいと思います。

友だちの機能はメンバー機能のようにアクセスできますか?例については

class myinfo { 
     private: 
      char name[20]; 
      int id; 
      float income;   
     public: 
      void showInfo(void); 
      myinfo(void); 
      friend void updateInfo(myinfo); 

     int main () { 

     myinfo j; 
     updateInfo(j); // calling the friend function 

    return 0; 
} 

    void updateInfo(myinfo c) { 
     strcat(c.name, ":updated"); 
     c.id++; 
     c.income += 1.1; 

答えて

6

はい、ではなく、あなたがそれを書いた...あなたは関数がオブジェクトに渡された変更したい場合は、値によって参照ではなくを受け入れる方法。 ..

referencesについては、C++で学んでいないようです。ところで

// Declaration of function in class 
friend void updateInfo(myinfo&); 

実装

void updateInfo(myinfo& c) 
{ 
    strcat(c.name, ":updated"); // now modifying passed in instance of c. 
    c.id++; 
    c.income += 1.1; 
} 

。副紙面では、std::stringを使用し、のルール3つを(特にこのような非自明なクラスの場合)について学ぶことを好みます。

+0

申し訳ありません。 – Ali

+0

少し説明や参考例がありますか?ありがとうございました – Ali

+0

@Ali、私はあなたのコメントを取得していませんが、私はあなたがコードを変更したのを見ますが、機能は引き続き 'myinfo'を値で受け取ります。' c'はコピー(デフォルトコピー)この一時的な。渡されたインスタンスを変更する場合は、参照を受け入れるようにシグネチャを変更する必要があります。 – Nim

0

はい、原則として、クラスのプライベートおよびプロテクトされたメンバーは、宣言されている同じクラス外からアクセスすることはできません。ただし、このルールは友人には影響しません。

フレンドはfriendキーワードで宣言された関数またはクラスです。

外部関数をクラスのフレンドとして宣言して、この関数がこのクラスのプライベートメンバーとプロテクトメンバーにアクセスできるようにするには、クラス内のこの外部関数のプロトタイプを宣言し、それにキーワードfriendを先行させる。

ここでそれを参照してください - 私は少しそれは私が私の仕事からの例を使用して間違いだったが、それは実際にどんな意味がない私のコードを変更したhttp://www.cplusplus.com/doc/tutorial/inheritance/

関連する問題