0

メンバを持つスタック クラスと push という関数があります。

class STACK
{
    int data;
    public:
    void push(int x)
    {
        data=x;
    }
}

このステートメントを変換するために C++ が行うことは次のとおりです。

s1.push(3);

s1.push(this,3);

this基本的に私の質問は、ポインターを生成して隠し引数として渡すために内部で何が起こるかということです。

私は実際に C でコーディングしています。私の目的は、できるだけ OOP に近いプログラムを作成することです。このために、構造体のメンバーとして関数ポインターがあります。したがって、どの構造が関数と呼ばれるかを何らかの方法で追跡できるかどうかを知りたいです (「this」ポインターのように)。次のようなことはしたくありません: s1.push(&s1,3); それは私の目的に勝るからです。

s1.push(3); を変換することは可能ですか? s1.push(&1,3); に MACRO 置換経由

4

6 に答える 6

6

まず最初に!ステートメント:

s1.push(3);

は次のように翻訳されていません:

 s1.push(this, 3);

しかし、次のようなものに:

STACK::push(&s1, 3); 

whereSTACK::pushは、 class/namespace の下のグローバル/名前空間または静的関数として扱われる場合がありSTACK、そのプロトタイプは次のようになります。

push(STACK const* pThis, int arg);

thisポインターは、常にメソッド (関数) の最初の引数です。メソッドに引数がない場合でも、引数は 1 つ (thisクラスのポインター) になります。

于 2013-03-10T12:42:10.813 に答える
3

魔法はありません

s1.push(3);

は単なる構文です

STACK::push(&s1, 3);
于 2013-03-10T12:37:12.717 に答える
0

残念ながら、C ではポインターを明示的または暗黙的に指定する必要があります。

C++ の場合、暗黙的thisなポインターをクラス メンバー関数の引数として設定するのはコンパイラの役割です。あなたのコードでは、メンバー関数はvoid STACK::push(STACK*, int)コンパイル時にコンパイラによって自動的にマングルされます。その後、メンバー関数STACK::pushが呼び出されると、コンパイラはオブジェクト アドレス ( this) を引数 (通常は最初のもの) としてメンバー関数に設定しますSTACK::push

上記の関数を提供する C コンパイラはありません。したがって、ポインタを設定するのはユーザーの責任です。

于 2013-03-10T13:35:14.487 に答える
0

編集後、質問は別の問題、つまり C の OOP を取り上げます。これは難しく、タイプセーフではありませんが、実装することは可能です。Cでオブジェクトシステムを提供するGObjectライブラリを見ることができます。マクロを多用していると思います。

于 2013-03-10T17:21:03.587 に答える
0
this = &s1

s1 のアドレスはわかっているので、STACK::push に渡すことができます。それはとても簡単です:)

于 2013-03-10T12:36:18.050 に答える
0

C++ はステートメントを正確に変換しません (C++ は言語仕様であり、多くの方法でその言語を実装することができ、非倫理的であっても、紙の上で作業する奴隷の集団を使用して、コンピューターが必要な場合でも必要ありません)。 、C++ を使用する)。コンパイラ (GCC など) は、ステートメントを他の下位レベルの表現に変換します。GCC では Gimple ステートメントであり、Gimple 表現は、たとえばMELT のプローブまたは-fdump-tree-gimpleおよびその他のオプション (-fdump-tree-allまたは-fdump-tree-ssaなど...)を使用して調べることができます。

于 2013-03-10T12:37:38.413 に答える