Top/article/Inherit-friend-property
English | Japanese
English | Japanese

Menu

  • Top
  • Akihiko Yamaguchi 山口 明彦
  • Project プロジェクト
  • Text テキスト
  • Recent articles 最近の記事
  • Articles 記事一覧 (a to z)
  • Search 検索

Tags タグ †

  • [c++][bash][python][latex][php]
  • [linux][windows][mac][android]
  • [math][algorithm][idea][trick]
  • [liboctave][opencv][git][ros]
  • [setting][bug][general]
↑

Recent articles 最近の記事 †

2019-07-02
  • article/Display-Unix-Time
  • article/Synchronize-Linux-Time-to-Remote
2018-09-27
  • article/python-multimode-singleton
2018-09-02
  • article/rosinstall-git-default-remote
2017-07-28
  • article/SubMenu
2017-03-05
  • article/Import-a-different-version-of-OpenCV-in-Python
2015-08-17
  • article/DRC-finals-2015
2015-01-05
  • article/Upgrade-Android-to-Lollipop
2015-01-01
  • article/Kernel-panic-of-Linux-when-using-Xtion
  • article/Do-not-skip-freeing-data-when-using-tri-mesh-in-ODE
Access: 1/1887 - Admin
These search terms have been highlighted:[c++]

Inherit friend property

friend 属性を継承する

[c++]
2010-04-20

C++ では,クラスを継承しても friend 属性は継承されない.継承させたい場合,どうするか?

friend は使わない方がいいといわれることがあるが,operator<<や operator>> の定義など,使った方がよい場合もある (e.g. When should you use ‘friend’ in C++?).

問題設定 †

  • クラス TItem は private メンバ変数 x_ を持つ.x_ はユーザに書き換えられてはならない
    • なお,ユーザは TItem のインスタンスを作成できる
  • クラス TTest は TItem を要素に持ち, x_ を書き換えることがある
    • TItem はあくまで TTest の要素.TItem を派生させたりはしない
  • ユーザがクラス TTest と類似のクラスを作られるようにしたい
    • そのクラスは TItem の x_ を書き換えることがある
↑

解 †

ユーザが作るクラスの識別子は不明なので,ユーザが作るクラスを TItem の friend クラスにするのは無理.

そこで,TItem の friend クラスを基本クラスとして作成,そこから TTest などを派生するようにする.ただし,派生しても friend 属性は継承されないから,基本クラスに TItem の private メンバにアクセスする関数群を作る.

↑

例 †

#include <iostream>
using namespace std;

class TItem
{
private:
  double x_;
  friend class TBase;
};

class TBase
{
protected:
  static double& x_(TItem &i) {return i.x_;}
  static const double& x_(const TItem &i) {return i.x_;}
};

class TTest : public TBase
{
public:
  TTest(const double &init)
    {
      x_(i_)= init;
        // NOTE: i_.x_ は private なのでアクセスできない(TTest は TItem の friend じゃない)
      cerr<<"x_(i_) has been initialized by "<<x_(i_)<<endl;
    }
private:
  TItem i_;
};


int main(int argc, char**argv)
{
  TTest t1(0.5);
  TTest t2(3.14);
  return 0;
}

これで,ユーザは基本クラス TBase から派生させたクラスからでないと,TItem のメンバ変数を書き換えることは不可能.逆に,TBase から派生させたどんなクラスでも,TItem のメンバ変数を書き換えられる.




Last-modified:2015-01-01 (Thu) 09:18:26 (3838d)
Site admin: Akihiko Yamaguchi.
Written by: Akihiko Yamaguchi.
System: PukiWiki 1.5.0. PHP 5.2.17. HTML conversion time: 0.009 sec.