1

これをどうやって聞くかはわかりませんが、誰かが理解してくれることを願っています。3つの異なるクラスがあるとしましょう。クラスA、クラスB、およびクラスC。クラスCは、コンストラクターのパラメーターとしてクラスAまたはクラスBのいずれかを取り、それをプライベート変数に格納する必要があります。

これは、オーバーロードされたコンストラクターを使用すると簡単です。私の質問は、使用されたコンストラクターに応じて、クラスCがどのようにして正しいクラスを自動的に使用できるかということです。(これらの2つのクラスは似ていますが、異なるライブラリからのものであるため、共有基本クラスがないことに注意してください)。これはテンプレートで可能ですか?テンプレートの経験はあまりありません。

4

2 に答える 2

0

はい、これはテンプレートで可能です:

#include <iostream>

template<class T>
class C {
public:
    C(T const& ref) : ref(ref) {}
    void doStuff() const {
        ref.doStuff();
    }
private:
    T ref;
};

class A {
public:
    void doStuff() const {
        std::cout << "A::doStuff" << std::endl;
    }
};

class B {
public:
    void doStuff() const {
        std::cout << "B::doStuff" << std::endl;
    }
};

int main() {
    C<A> foo((A()));
    foo.doStuff();

    C<B> bar((B()));
    bar.doStuff();
}
于 2012-10-26T09:20:50.507 に答える
0

テンプレートを使用すると、非常に簡単に実行できます。

class A;
class B;

template<class AorB>
class C
{
public:
    C(AorB aorb)
        : aorb_(aorb)
        { }

private:
    AorB aorb_;
};

これが行うことは、クラス内Cで識別子AorBを他のクラスとして使用できることです。実際、インスタンスである必要はなく、任意のクラスにすることAできBます。

次のように使用できます。

A myA;
B myB;

C<A> myCWithA(myA);
C<B> myCWithB(myB);

ただし、テンプレートを使用してクラスを作成するときに覚えておかなければならないことが 1 つあります。仕様と実装を別個のヘッダー ファイルとソース ファイルに分割することはできなくなりました。すべてのコードがヘッダー ファイルで利用可能である必要があります。

メンバー関数の構文も少し異なります。

例:

template<class T>
class C
{
public:
    ...

    void someFunction();
};

template<class T>
C<T>::someFunction()
{
    ...
}
于 2012-10-26T09:21:32.200 に答える