1

次のような純粋仮想メソッドのみを持つクラスを作成することで、C ++ java / C#のようなインターフェイスを操作しようとしています:(これは単なる例です)

class IMyInterface
{
public:
    virtual int someFunc() = 0;
    virtual ~IMyInterface() {}
};

の配列内の2つの要素を交換するメソッドの実装に行き詰まるまでは、すべて問題ありません。コンパイラが実装しないIMyInterfaceことについて文句を言うため、C++ではインターフェイスをインスタンス化することが許可されていないためです。tempsomeFunc()

void Exchange(IMyInterface* array, int i, int j)
{
    IMyInterface temp = array[i]; // not allowed
    array[i] = array[j];
    array[j] = temp;
}

そのため、インターフェイスクラスの定義を変更し、純粋仮想関数を削除して、次のようなメソッドの「デフォルト」実装を提供する必要がありました。

class IMyInterface
{
public:
    virtual int someFunc()
    {
        return 0;
    }
    virtual ~IMyInterface() {}
};

問題は、IMyInterfaceもはやインターフェースではなく、それから継承するクラスが実装することを強制しないことsomeFunc()です。

とにかくこれの周り?

4

1 に答える 1

2

インターフェイスは完全に定義されたオブジェクトではないため、それらのインスタンスを作成することはできません。それらは未定義のサイズと構造であるため、値のコンテキストで作成または使用することはできません。ただし、オブジェクトへのポインターは非常に明確に定義されているため、インターフェースへのポインター(Happy Guys?)を作成できます。サンプルコードは次のようになります。

void Exchange(IMyInterface** array, int i, int j)
{
    IMyInterface* temp = array[i]; // allowed :)
    array[i] = array[j];
    array[j] = temp;
}

操作が値によって実行される必要があるものである場合は、おそらくテンプレート関数の方が適切です。

于 2013-02-19T05:58:18.200 に答える