0

言語:CPP(C ++)

これを夢見たかどうかはわかりませんが、クラスオブジェクトをパラメーターとして、クラス型ではなく、クラス内にある型を期待する関数に渡すことは可能ですか。

function(object-> target_variable)を実行する代わりに、いくつかのルールを設定できると非常に便利です。

function(object)

これは次のようになります。

function(object->target_variable)

この望ましい動作を指定する方法はありますか?

4

3 に答える 3

1

クラスにキャスト演算子を作成すると、関数が特定の型を予期し、そのメンバーを提供するクラスのインスタンスを提供するたびに作成できます。複数のメンバーがいる場合は、このように(同じタイプで)処理する必要がある場合は機能しません。

または、関数をオーバーロードして、クラスのインスタンスへの参照を受け入れ、代わりにインスタンスメンバーを使用して元の関数を呼び出すことができます。ここでの欠点は、すべてのクラスの関数をオーバーロードするか、これらすべてのクラス(インターフェイスまたは「コントラクト」)に共通の祖先を作成する必要があることです。

于 2013-01-16T13:12:43.163 に答える
1

OK、それはもうコメントに収まりません。「基本的に契約」の場合は作成してください!例えば:

struct IDeliverSDLSurface {
    virtual SDL_Surface* GetSurface() const = 0;
    virtual ~IDeliverSDLSurface() = default;
};

class A : public IDeliverSDLSurface {
    SDL_Surface* m_Surface;

    // implements IDeliverSDLSurface
    virtual SDL_Surface* GetSurface() const
    {
        return m_Surface;
    }

    // other stuff    
};

class B : public IDeliverSDLSurface { /* etc */ };

// etc.

次に、中間層を記述します。ここで、サービスIDeliverSDLSurface*はサーフェスを取得して適切な「エンジン」サービスに渡します。例:

namespace Intermediate {
    void Foo(IDeliverSDLSurface* p_Object)
    {
        // call engine's Foo
        Engine::Foo(p_Object->GetSurface());
    }

    void Bar(IDeliverSDLSurface* p_Object)
    {
        // call engine's Bar
        Engine::Bar(p_Object->GetSurface());
    }

    // etc
}

その種のより洗練された(半自動)ディスパッチャーを書くこともできますが、あなたはその考えを理解します...クライアント側では、以下Intermediateを実装するすべてのタイプのすべてのインスタンスで関数を呼び出すことができIDeliverSDLSurfaceます。

A tA;
Intermediate::Foo(&tA);

B tB;
Intermediate::Bar(&tB);

// etc...
于 2013-01-16T11:17:34.337 に答える
1

SvenSが指摘したように、クラスにキャスト演算子を作成できます。constchar*にキャストする例を次に示します。このコードはあなたのクラスに入ります:

// operator to cast to a const char *
// 
operator const char *()
{
    m_pStr[m_nSize] = '\0';
    return(m_pStr);
}

完全な例については、http://msdn.microsoft.com/en-us/library/ts48df3y.aspxを参照してください。

于 2013-01-17T13:38:24.693 に答える