私は仮想テーブルと仮想ポインタを試していました。VTABLEにアクセスすると、定義されていないエラーが発生する
//a simple class
class X
{
public:
// fn is a simple virtual function
virtual void fn() { cout << "n = " << n << endl; }
// a member variable
int n;
};
int main()
{
// create an object (obj) of class X
X *obj = new X();
obj->n = 10;
// get the virtual table pointer of object obj
int* vptr = *(int**)obj;
__asm__("mov %eax, obj;");
// function fn is the first entry of the virtual table, so it's vptr[0]
((void (*)()) vptr[0])();
// the above should be the same as the following
//obj->fn();
return 0;
}
しかし、コンパイラは次のエラーを与えている:
/home/OaVTND/cclnoQaK.o: In function 'main': prog.cpp:(.text.startup+0x26): undefined reference to `obj'
collect2: error: ld returned 1 exit status
私はアセンブリ言語コードに慣れていないよ知っているより多くの私は、次のようでした。私はこれを他の人のコードから借りた。私はgcc-4.9とCentos 7 x64ビットサーバーを使用しています。
インラインasmはいくつかの点で壊れています(インラインアセンブリに入力オペランドとしてobjのアドレスを渡す必要があります。%eaxのランダムな内容をobjに移動します)。あなたが達成しようとしていることは明確ではありません。 – yugr
あなたは__asm__の中で何をしていますか? –
@GreenTree:彼は、オブジェクトのアドレスをEAXにロードすることによって 'this'ポインタを設定しようとしています。コール・ステートメントが誤ってEAXを使用してターゲット・アドレスを計算していない限り、それは問題ありません。 –