• ベストアンサー

メンバ関数へのアクセス

VC++6.0です。 class Aのインスタンスをたくさん作って そのポインタをvectorに格納しているとします。 添え字付けしてa[i]と表記しましょう。 iとjが異なっているとき、a[i]がa[j]のメンバ関数にアクセスすることはできますか? アクセスできるとしたら、その書式を教えてください。 要は、メンバ関数は、classのものなのか、 インスタンスに所属するものなのか、という疑問です。

noname#108554
noname#108554

質問者が選んだベストアンサー

  • ベストアンサー
noname#5537
noname#5537
回答No.2

ごめんなさい。ちょっと例が悪かったですね。 例えば、 class A に StaticFunc という static なメンバ関数があるとします。 この StaticFunc を呼ぶ場合には、  A::StaticFunc(); という書式で呼び出すことが出来ます。(つまり、インスタンスを指定しなくてもよいということ) 特に class A のメンバ関数内から呼び出す場合は、A:: を省略して、  StaticFunc(); で呼び出すことが出来ます。 但しここで気をつけないといけないのは、 StaticFunc の中から class A の static でないメンバにアクセスする場合は、 そのインスタンスを明示しなければならないということです。 > ということは、a[j] -> Hoge(); > という書式ではかけないんですね? インスタンスへのポインタ(p とする)が分かっている場合は、static でないメンバ関数と同じように、  p->StaticFunc(); という書式で呼び出すこと も 可能です。 > iとjが異なっているとき、a[i]がa[j]のメンバ関数にアクセスすることはできますか? a[i] のメンバ関数内から、a[j] のメンバ関数を呼び出す場合、 呼ばれる側のメンバ関数が static ならば、インスタンスを指定しなくてもよいので、  StatinFunc(); という書式で呼び出せます。 呼ばれる側のメンバ関数が static でなければ、なんらかの方法で a[j] のインスタンスへのポインタ(p)を取得して、  p->NonStaticFunc(); という書式で呼び出さなければなりません。

noname#108554
質問者

お礼

分かりやすい例をありがとうございました。

その他の回答 (1)

noname#5537
noname#5537
回答No.1

static でないメンバ関数はインスタンスを指定しないと呼び出せません。 従って,a[i] から a[j] のメンバ関数を呼ぶには, a[i] はなんらかの方法で a[j] のポインタを知る必要があります。 static なメンバ関数の場合はインスタンスを指定しなくても呼び出せます。 CHoge::Hoge(); という書式で呼び出せます。 概念的には、 static なメンバは class に属し、 static でないメンバはインスタンスに属す。 と考えることが出来ます。

noname#108554
質問者

お礼

速い回答ありがとうございます。 >CHoge::Hoge(); という書式で呼び出せます。 Cとはなんでしょうか。 a[j]::Hoge(); ということですか?

noname#108554
質問者

補足

すみません、追加です。 ということは、a[j] -> Hoge(); という書式ではかけないんですね?

関連するQ&A

  • 2次元のvectorにオブジェクトのポインタを格納

    VC++6.0です。 まず、ポインタでなく、int型の格納なら分かったんです。 ・・・ #include <vector> using namespace std; main(){ vector <vector<int > > a(10); ←←← for(int i=0;i<10;i++){ a[i].resize(10); } ・・・ for(int j=0;j<10;j++){ for(int i=0;i<10;i++){ a[i][j]=i+j; } } ・・・ } という感じで利用できることが。 しかし、やりたいのは、整数型でなく、 オブジェクトのポインタを格納したいんですが、 矢印部分を例えば、vector <vector<class *> > a(10); などどしてもエラーになってしまいます。 どのように実装したらよいのでしょうか?

  • メンバインスタンスへのアクセス方法

    クラスインスタンスをメンバ変数として保持した時、その保持しているインスタンスのメンバや関数にはどのようにアクセスすればよいのでしょうか。 PHPの文法がまだよくわからないのですが、次のようにやると、エラーになってしまいました。 <?php class Test {  var $member;  public function __construct() {   $member = new Hello();  }  public function test() {   $this->member->world();  } } class Hello {  public function world() {   echo 'hello world';  } } $test = new Test(); // $test->test();はエラーとなってしまう。 $test->test(); ?>

    • ベストアンサー
    • PHP
  • オーバーロードされたメンバ関数のポインタをとる

    オーバーロードされたメンバ関数のポインタをとるにはどうしたらよいでしょうか? 具体的には前置インクリメント演算子 ++()と、後置インクリメント演算子 ++(int)の両方のをオーバーロードしたときに両方のメンバ関数ポインタがとりたいです。 環境はVC7.1です。 よろしくお願いします。

  • 【C++】同じインスタンスの同じメンバにアクセスしているハズなのに、取得した値が異なる

    C++Builder6.0を使った画面アプリです。1つのexeとしてビルドしています。 メンバ変数へのアクセス firstFormインスタンスのメンバ stNode.count を 次の2箇所からアクセスしています。 (正確にはfirstFormが持つ、stNode構造体メンバのcountにアクセス) (1)firstFormのメンバ関数から読み取る (2)firstFormから呼び出されるsecondFormのメンバ関数から読み取る なぜか(1)と(2)で読み取った値が異なります。 しかし値が変わるような処理はしていません。 firstForm, secondForm はそれぞれ、TFromから派生したクラスです。 -------------------------------------------------------------------- 1回目のアクセス。期待する値を取得できた。 this ( TForm から派生する firstFormのインスタンスのメンバ関数からのアクセス )の値 :01682E0C nnum = this->stNode.count; 004037C1 8B4508 mov eax,[ebp+0x08] //多分、thisポインタをeaxに格納 004037C4 8B90DC030000 mov edx,[eax+0x000003dc] //thisポインタのメンバである stNode.nodesuの中身をedxに格納 004037CA 899578FFFFFF mov [ebp-0x00000088],edx //edxの中身をローカル変数nnumに格納 EAX 01682E0C EDX 0000022D EBP 0012F8F0 -------------------------------------------------------------------- 2回目のアクセス。( TForm から派生する secondFormのインスタンスのメンバ関数からのアクセス ) secondForm のポインタはthisと同じである :01682E0C nnum = secondForm->stNode.count; 004072B7 8B0D409B4900 mov ecx,[__ectbl__ __LateVCLInit + 0x2C] 004072BD 8B01 mov eax,[ecx] 004072BF 8B90D0030000 mov edx,[eax+0x000003d0] 004072C5 895580 mov [ebp-0x80],edx ECX 0049A5EC EAX 01682E0C EDX 0177F280 ---------------------------------------------------------------------- どちらの場合もEAXにfirstFormへのポインタが格納されているようです。 なのに、メンバへのオフセット?が 1回目は 0x03dc , 2回目は 0x03d0 となり12バイトずれて います。(オフセットがやたら大きい気はします。) メモリの中身をデバッガで確認すると、確かに12バイトずれたところに欲しい値があります。 ソースコードを眺めてもさっぱりわかりません。 何を調べれば良いのかさっぱり分かりません。 解決できる気がしないのですが、いろいろ考えるのも勉強になると思うので 「こういう可能性もあるのでは?」「これを調べたら?」といったアドバイスなど頂けたら助かります。 #不可解な事象というのは往々にして、全然関係ない初歩的なことに原因があるものですが・・・今回もそうなんだろうか。

  • 基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

    VC++でプログラミングをしています。 A(基本クラス) B(派生クラス) を作成しました。Bは、Aの特別な場合です。 このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか? 基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。 (純粋仮想関数という方法もあるようですが、) 操作としましては、 Aのポインタ配列 A* a[100]を作成し 特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。 派生クラスにのみあるメンバ関数を、Readとします。 for(i=0;i<100;i++){ if(派生クラスBの場合){ a[i]->Read() } } 現状では、コンパイルエラーで、 関数Readは、aのメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。

  • 【C++】クラス内のメンバ関数の占める領域

    C++のことです(恐らく、他言語にも共通していると思いますが)。 例えば、 class a { void func(); }; という風なクラスがあったとして、これを a kurasu[100]; と言う風にインスタンスを生成した場合、メンバ関数funcも100個分作られるのでしょうか。 “関数が作られる”って言い方は適切でないかもしれませんが……。。。 100個分の関数用にメモリが割り当てられるのか、といったニュアンスです。 よろしくお願いします。

  • 「static宣言されているメンバ関数」は、「インスタンスメソッド」な

    「static宣言されているメンバ関数」は、「インスタンスメソッド」なのでしょうか? それとも、「クラスメソッド」なのでしょうか? 先日、下記内容で質問して、その時は分かったつもりだったのですが、 やっぱり分かってなかったようなので、教えてください。 ▽「クラス関数」「メンバ関数」「メソッド」の違いを教えてください。   http://okwave.jp/qa/q5858806.html 例) ▽前提 ・Aクラスのインスタンスa ・static宣言されたpublicメソッド「static_public_method」 ・static宣言されていないpublicメソッド「public_method」 ▽メンバ関数呼び出し ・$a->static_public_method() ・A::static_public_method() ・A::public_method() このとき、「$a->static_public_method()」は、インスタンス経由でアクセスすることになるので、 「インスタンスメソッド」になるのでしょうか。それとも、static(静的)宣言しているので、「クラスメソッド」になるのでしょうか? また、「A::static_public_method()」や、「A::public_method()」は、どちらになるのでしょうか? ※現在、頭の中がこんがらがっているのは、下記3点です。どれかひとつでも構わないので、分かりやすい考え方等あれば、ぜひ教えてください。 ・「static宣言したメンバ関数」は、「インスタンスメソッド」? 「クラスメソッド」? ・「スタティック」宣言してるのに、メンバ関数へ、「->(アロー演算子)」(オブジェクト経由)でアクセスできる理由 ・「A::static_public_method()」と「A::public_method()」の違い

    • ベストアンサー
    • PHP
  • 継承元のpublicなメンバ関数を隠ぺいしたい

    C++です.(VC++2013) 親クラスではpublicで宣言されているメンバ関数があり,継承後はこのメンバ関数を隠ぺいしたいときはどのようにすればよいのでしょうか. 具体的には,std::vectorから派生したクラスを定義し,この独自クラスのインスタンスへ要素を追加する場合は,新しく独自に定義した関数を通じて行います. そのため,push_back()を呼べないようにしたいのです. 自分で作成した関数には,pushという名前をつけたいので,単純に自分の要素追加の関数をpush_backという名前でオーバーライドすることはできません. push関数内では,push_backした後,即座にsortしたいので,push_backをいう名前をつけたくないのです. とりあえずは,派生クラスでprivateにpush_backをオーバーライドし,自分で作った要素追加の関数で使うpush_backはstd::vectorのものを用いることを明示することでできました. 他にも何かやり方があれば,ご教授下さい.

  • メンバー関数ポインタ

    非常に基礎的なことで申し訳ないですが。 クラスのメンバー関数へのポインタ変数へ 代入しようとすると 関数呼び出しには引数リストがありません。 とエラーがでます。 何がわるいでしょうか? 以下のような感じのコードです。 void (classname::*P_func)() = classname::func; 定義しただけと思いますが。。 VCです。 よろしくお願いします。

  • 【C++】関数のアドレス

    Aクラスの持つ、 メンバーxのアドレスが100番地で、関数yのアドレスが200番地のとき、 (イメージ図「■■■■■■■■■■★★★★★★★★★★」)         ↑この辺が100番地  ↑この辺が200番地 Aクラスのポインタ型に、 Aクラスを継承したChildBクラス(関数zを持つ)を格納したら、 ChildBクラスの関数zの格納される場所って、確保できないはずでは?と思っていましたが、 実際にソースを書いてみると、普通にコンパイルも通って、普通に実行もできますよね。 なぜなのでしょうか? 下のように認識しているのですが、どの辺の理解が間違っているのでしょうか? (イメージ図「■■■■■■■■■■★★★★★★★★★★」)         ↑クラスAのポインタには、■10個と★10個の分しかメモリを確保しないはず。         しかし、実際に関数zを動作させることができているのが不思議です。 というのは、クラスAをインスタンス化するのに100バイト必要だったとして、 色んな拡張をしたChildBクラスは、300バイト必要な状況だったなら、 100バイトしかない、「クラスA」には格納しきれないのでは?と感じたのです。 仮に、ポインタ型が、各プロパティや各関数の格納先の「アドレスの先頭」だけを格納していたとしても、 クラスAには存在しない、関数zの「アドレスの先頭」を格納するための領域そのものがないはずなのでは?と捉えているのです。 動いている以上、私の認識のどこかしらが間違っているというのはわかるのですが、 どの辺を誤解してしまっているのでしょうか? .

専門家に質問してみよう