• 締切済み

参照型のオフセット取得

C++でリフレクションを実装するため、全メンバー変数のオフセット をoffsetofで取得し、メンバ変数名とオフセットをstd::mapに登録 しようとしています。 ここで質問なのですが、参照型に対してoffsetofを取得しようとすると アクセス違反で落ちてしまいます。原因を調べてみると、クラスの オブジェクトがobj、メンバ変数が参照型refだとすると、&obj.refは ref変数のアドレスを返すのでは無く、refが指している変数のアドレス を返してくるのが原因でした。 長くなりましたが、ref変数のアドレスを取得する方法、またはオフセット を取得する方法は無いのでしょうか?これが出来ないと、参照型については未サポートにするしか無くなってしまいます><

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> ref変数のアドレスを取得する方法、またはオフセット > を取得する方法は無いのでしょうか? ありません。

関連するQ&A

  • PHPの参照渡しについて

    以下のようなコードがあったとき $obj = new stdClass(); $foo = $obj; この場合、動作は いわゆる【参照の値渡し】というとらえかたでよいのでしょうか? 変数$obj には、 new stdClass();という記述によって 新規に作成されたオブジェクトの参照(※正確には別のメモリ内に保持されたオブジェクトのアドレス) が保持されるわけですよね? そのとき $foo = $obj; というコードは$objが保持するオブジェクトのアドレス値を$fooという変数にも コピーするという動作を意味するわけですよね。 この場合、両変数を用いて生成されたオブジェクトのプロパティなどの状態を 共有することとができます。 しかしながら変数$fooに別の値、例えば文字列を代入すうると $foo = "文字列"; とすると$fooの値が変更され$objの値は変更されません。 対して、次のようなコードがあった場合 $foo = &$obj; というコード、これはPHPにおける参照渡しですが、 この場合は$objが指し示す、オブジェクトが保持されているメモリ上のアドレスではなく そのメモリ上に確保された変数$objそのもののアドレスが$fooという変数にコピー? されるのでしょうか? この明示的な参照渡しだと、オブジェクトの状態を共有するのはもちろん $foo = "オブジェクト破棄"; と片方に文字列を代入すると print $obj; 同様に文字列にかわってしまいます。 この本来の意味?であろう参照渡しとは実際 $fooに変数$objそのもののアドレスが保持されるという 解釈でよいのでしょうか? おくわしいかたご教授ください。

    • ベストアンサー
    • PHP
  • オブジェクトの参照を返す関数の扱い

    オブジェクトの作成と関数との関係を勉強していますが参照の使い方に関して質問させていただきたいと思います。 以下のような簡単なプログラムを作りました。 myclass.cpp myclass.h で記述されたクラスmyclassは整数を一つ持ち、show_value関数でその整数を表示し、say_heyで"hey"という文字を出力するというものです。 このクラスを利用するプログラムとしてmain.cppをつくりました。このなかには2つの関数が使われます。 -オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj)   -オブジェクトをつくりそれの参照を返す関数(return_ref_obj) これらの関数を用いてオブジェクトをつくり、そのオブジェクトを戻り値としてmainのなかでオブジェクトのshow_value関数で保持する整数を表示する、というものです。 myclass.h-------------------------------- class Myclass{ public: int my_int; Myclass(); ~Myclass(); void show_value(); void say_hey(); }; myclass.cpp---------------------------------- #include "myclass.h" #include <iostream> using namespace std; Myclass::Myclass(){}; Myclass::~Myclass(){}; void Myclass::show_value(){ printf("%d\n", my_int); } void Myclass::say_hey(){ printf("hey\n"); } main.cpp------------ #include <iostream> #include "myclass.h" using namespace std; //オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj)   Myclass return_obj(int int_in){ Myclass myobject; myobject.my_int = int_in; //引数をオブジェクトのmy_intに渡す return myobject; } //オブジェクトをつくりそれの参照を返す関数(return_ref_obj) Myclass& return_ref_obj(int int_in2){ Myclass myobject; myobject.my_int = int_in2;   //引数をオブジェクトのmy_intに渡す Myclass& ref_of_myclass = myobject; return ref_of_myclass; } void main(){ Myclass returned_obj = return_obj(1); //関数に1を渡し、1を保持するオブジェクトを作成 returned_obj.show_value(); //整数(1)表示 returned_obj.say_hey(); Myclass& ref_obj = return_ref_obj(2); //関数に2を渡し、2を保持するオブジェクトを作成し参照として受け取る ref_obj.show_value(); //整数(2)表示 ref_obj.say_hey(); } プログラムを実行した出力------------------- 1 hey -858993460 hey このようにオブジェクト自体を返してコピーしたもの(return_obj使用)はshow_valueでただしくオブジェクトに保持された数が表示されますが 参照でオブジェクトを返したもの(return_ref_obj使用)はアドレスのような数列が表示されます。 質問A これはオブジェクトの参照を返す関数(return_ref_obj)でオブジェクトを作成しても、そのオブジェクトが関数の中でのみ実在しており、関数がおわるとその実体がなくなるためではないかと解釈しているのですがそれで正しいでしょうか? 質問B 関数でオブジェクトを作成してそれをプログラム本体に渡すときはreturn_objのようにオブジェクト自体をコピーしなければ参照などで渡すことはできないのでしょうか? クラスと参照自体勉強を始めたばかりで色々と初歩的な間違いもあるとは思いますが、よろしくお願いします

  • javaで参照そのものを値として取得する事は出来ますか?

    javaで参照そのものを値として取得する事は出来ますか? あるいは、Mapで同じ値のオブジェクトでも参照が異なれば異なるキーを作るようにする方法はありますか?

    • ベストアンサー
    • Java
  • 参照型変数について

    オブジェクトはメモリ上どの場所に生成されたか分からないので、参照型変数を生成して、そのオブジェクトのアドレスが分かるとのことですが、同じように参照型変数もメモリ上で生成されるのだから、アドレスがあると思うのですが、どうやれば分かるのですか?

    • ベストアンサー
    • Java
  • オブジェクト・・・参照代入・・・???

    問題(1) class ApBase extends Object implements Runnable (省略) ApBase aBase = new ApBase(); Runnable aR = aBase; ○ オブジェクトにインターフェースが実装されていることがわかる限りオブジェクト参照をインターフェイス参照に 代入することは可能です。 問題2 class ApBase extends Object implements Runnable (省略) Object obj = aBase; Runnable rn = obj; × コンパイラにとってobjはObjectなのでRunnnableインターフェイス参照への代入は認められません。 同じほんの問題です。 矛盾していませんか??? ・・・・多分僕の理解が足りないだけです(^_^;) もう少しわかりやすく教えてください・・・ お願いいたします

    • ベストアンサー
    • Java
  • 参照カウンタについてその3

    参照カウントについて質問で ”単純な実装"では、共有オブジェクトの廃棄は最後に参照解除したスレッドで行われます。一斉に解放される場合、最後に参照されたスレッドが重くなります。とは、なぜ最後に参照されるとスレッドが重くなるのでしょうか? また、"単純な実装"では、カウンタが0になったら、"自分で自分を"削除します。 この”自分で自分を"というところがポイントです。 何か、使われている変数を監視しているスレッドが存在して、 それが、カウントの値をチェックし、0であったら削除する (これがGCですね) とは違います。 とは何が違うのでしょうか?もしかして"単純な実装"は自分で自分を破棄してGCでは別の関数か何かで削除しているということでしょうか あとそれぞれのスレッドが固有のオブジェクトを持っている場合、 "単純な実装"では スレッドごとにオブジェクトの破壊コードが実行されることになります。これは破棄されるときのことをいっているのでしょうか?

  • java.util.Listのヒープサイズの取得

    オブジェクトのサイズを取得するメソッドとして、  java.lang.instrument.Instrumentation#getObjectSize があることは教わったのですが、なんと、このメソッドは参照先オブジェクトの サイズを調べてくれません。 ですから、私の環境では、Listに何のオブジェクトをaddしても、しなくても 24 が返ってくるだけでした。 どなたか、List内のオブジェクトの合計のヒープサイズを求めるライブラリもしくは、 リフレクションとInstrumentation#getObjectSizeを使った合計のヒープサイズを調べる 具体的な実装例をご存知の方はおられませんでしょうか? ( 前の質問は全く無関係な方向に進んでしまっていますので、   しばらく放置させていただきます。ご了承ください。)

  • 参照型変数を宣言と同時に初期化しない

    参照型変数は、宣言と同時に初期化する必要があります。 宣言時には参照先が決定しておらず、条件によって動的に参照先を決定したい場合、どのように記述すれば良いでしょうか? ------------------------------------------------------------------- CMyClass& obj; // 条件によって異なるオブジェクトを参照したい switch (mode) { case A: obj = objA; // 外部で生成済みのオブジェクトへの参照 break; case B: obj = objB; break; ・・・ case X: obj = objX; break; } // 以下、mode共通の処理 obj.hogehoge(); ------------------------------------------------------------------- 三項演算子を入れ子にして一行に収めれば可能ですが、スマートではないし見た目にも良くありません。 CMyClass& obj = A ? objA : (B ? objB : objC);

  • 派生クラスのメンバを基底クラスの参照に代入(C++

    文末のコードのように、 基底クラスで、派生クラスのメンバの参照を持つのはまずいでしょうか。 (classではなくstructにしているのは質問上でのpublic:の省略のためだけです) 初期化順序的には、基底クラスの参照先は、 基底クラスのコンストラクタが走る時点で初期化されていないので、 コンストラクタ内で参照に対して何かしようとすると問題になると思っています。 基底クラスのコンストラクタ内で派生クラスメンバの参照に対して何かしなければ、 参照は有効で、派生クラスのコンストラクタ実行後であれば 問題なく動くと思ってよいでしょうか。 struct A { int& m_ref; A(int& ref) : m_ref(ref) { } }; struct B : public A { int m_obj; B() : A(m_obj) { } };

  • FileDialog オブジェクトでファイル名のみを取得

    FileDialog オブジェクトで返すオブジェクトを参照すると どうしてもファイルパスを取得する変数しか取得できません。 FileDialog オブジェクトで選択したファイルのファイル名のみを取得するにはどうしたらよいでしょうか。 ExcelVBAです。よろしくお願いします。

専門家に質問してみよう