2

あなたが持っているとしましょう:

struct c_struct {
   int value;
   /* other stuff */
   void (* dump)();
};

そして、ある時点で次のことをしたいと思います:

c_struct_obj->dump();

特定の「ダンプ」関数がその特定の「値」をC++メソッドがメンバー変数を知るように(暗黙の「this」を介して)知るように、c_structオブジェクトをインスタンス化する方法はないと思いますか?私はすでに答えを知っていると思います(「いいえ」)。もしそうなら、OOPy の方法で C 構造体を使用する他の方法はありますか?

4

4 に答える 4

6

もちろん、あなたはthis自分で通り過ぎる必要があります:

struct c_struct {
    int value;
    /* other stuff */
    void (* dump)(struct c_struct *this);
};

そして、次のように呼び出します。

c_struct_obj->dump(c_struct_obj);
于 2010-10-19T18:44:06.713 に答える
0

この方法で構造体を使用できますが、面倒です。すべての c++ メンバー関数は、それらに渡される *this ポインターを取得します。同じことができますが、ダンプ関数は、パラメーターとして含まれている構造体を取得する必要があります。

于 2010-10-19T18:45:27.130 に答える
0

C++ コンパイラを使用している場合、構造体とクラスの唯一の違いは、メンバー変数のデフォルトの可視性です (クラスはプライベート、構造体はパブリック)。this ポインターは、メンバー関数内で使用できます。

struct test
{
    int x;

    void inc();
};

void test::inc()
{
    x++;
}

int main(void)
{
    test a;
    a.x = 1;
    a.inc();
    int b = a.x;

    return 0;
}

ここで b == 2。

于 2010-10-19T18:48:40.353 に答える
0

これを行うことができ、継承を行うことさえできます。しかし、それとのインターフェースは完全に混乱しており、たとえば、C++ の決定論的な自動クリーンアップに関連するリソースの安全性にはほど遠いものです。最終的に、C で OOP を実行できますが、C++ を使用するだけでなく、C++ が提供する他のすべての機能と比較して、手間をかける価値はありません。

于 2010-10-19T18:49:05.737 に答える