かずきのBlog
C#やJavaやRubyとメモ書き

目次

Blog 利用状況
  • 投稿数 - 426
  • 記事 - 1
  • コメント - 461
  • トラックバック - 112
ニュース
  • 思い出は、いっぱい。
コメント
プログラマ的自己紹介
  • C#とRubyを趣味で。Javaを仕事で使ってやってます。 WPFをコツコツ勉強中。 IDE大好き。Visual Studio, Eclipse, NetBeansを使用中
お気に入りのツール/IDE
  • Visual Studio 2008 std
  • Eclipse
  • NetBeans6.0以降
  • 自作のツール
プロフィール
  • 大田 一希
  • 1981年1月30日産まれ
  • AB型
  • 左利き
経歴
  • 1993年 海田中学校 入学
  • 1996年 広島県立安芸南高等学校 入学
  • 1999年 某大学 環境情報学科 入学
  • 2003年 某大学 大学院 環境学研究科 入学
  • 2005年 就職して上京
  • 今に至る
アクセサリ
  • あわせて読みたい
  • ログ解析ネット証券

書庫

日記カテゴリ

 

C++だけ微妙に弱気なタイトルですが…
RubyやJavaやC#だと外部から色々頑張ればどうにかなったけど、C++ではどうにもならない。

#include <iostream>

class A
{
private:
 void Foo() { std::cout << "A#Foo" << std::endl; }
};

class B
{
public:
 void Bar()
 {
  A a;
  a.Foo(); // どうあがいてもコンパイルエラー
 }
};

int main()
{
 B b;
 b.Bar();
 return 0;
}

こういう場合は、C++では明示的にAクラスからBクラスに対してprivateメンバへのアクセスを許可する方法が提供されてるのでそれを使います。

書き方は、「friend class クラス名;」というわけでやってみよう。

#include <iostream>

class B; // AでBを見るために前方宣言
class A
{
 friend class B; // Bさんには私の全てを見せます
private:
 void Foo() { std::cout << "A#Foo" << std::endl; }
};

class B
{
public:
 void Bar()
 {
  A a;
  a.Foo(); // お友達なのでprivateな所も呼べる
 }
};

int main()
{
 B b;
 b.Bar();
 return 0;
}

実行すると、A#Fooと表示される。

投稿日時 : 2008年3月14日 18:05
コメント
  • # re: [C++]privateなメソッドを呼び出させてもらうぞ~
    774RR
    Posted @ 2008/03/14 18:12
    friend は一方向なので
    お友達と思っているのは俺だけー
    相手は俺のことお友達と思ってくれてないー
    という悲しい事態になっているわけですな
  • # re: [C++]privateなメソッドを呼び出させてもらうぞ~
    アキラ
    Posted @ 2008/03/14 18:37
    #define private public
  • # re: [C++]privateなメソッドを呼び出させてもらうぞ~
    かずき
    Posted @ 2008/03/14 20:29
    >774RRさん
    はい。いつの世もfriendなんてそんなもんかもしれないです。

    >アキラさん
    その発想は無かったですorz
  • # re: [C++]privateなメソッドを呼び出させてもらうぞ~
    THREE-ONE
    Posted @ 2008/03/15 1:48
    なんでしたっけ?
    4だけポインタのアドレス動かしたら private メンバにアクセスできるtかありませんでしたっけ?
    C はさっぱり詳しくないんですが
  • # re: [C++]privateなメソッドを呼び出させてもらうぞ~
    かずき
    Posted @ 2008/03/15 11:41
    >THREE-ONEさん
    それは聞いたことないです。
    でも、環境に依存しそうなコードになりそうですね~
タイトル  
名前  
Url
コメント