0

私は、Java の荒野で多くの時間を過ごした後、C++ にやや慣れていません。

データ クラス A と B と、Container と呼ぶコンテナー クラスがあるとします。

class A
{
public:
  virtual void foo()
  {
    cout << "I am an A" << endl;
  }
};

class B : public A
{
public:
  void foo()
  {
    cout << "I am a B" << endl;
  }
};

template <class T> class Container
{
public:
  T *_t;

  Container(T *t)
  {
    _t = t;
  }
};

私が望むものに相当するJavaは、次のようになります

B b = new B();
Container<? extends A> aContainer = new Container<B>(b);

これは C++ でどのように行うべきですか? これも正統ですか?

次のコードでは、コンパイル エラーが発生します。

B *b = new B();
Container<A> *aContainer = new aContainer<B>(b);

これまでのところ、Google は「? extends」に相当するものを見つけるのに役に立ちませんでした。

== 編集 ==

解決策は、Isaac Drachman が以下で説明しているように、「? extends」が不要になるようにコードを書き直すことでした。

4

2 に答える 2

0

C++ 11 (またはおそらくブースト) を使用std::is_base_of<A,B>している場合は、A が B の基本クラスである場合、 which contains (value=) trueを使用できます。

とにかく、これを行うことができます:

template<class T>
class container {
    void append(T* what);
}

派生へのポインターはベースのポインターにキャストできるため、container<base>試してみるかどうかを検討してください。append(derived)

ただし、これにより、何でもリストを作成できます。

Javaの「拡張」のように、それを制御したい場合。

static_assert(!std::is_base_of<base,T>::value,"You must derive from base");

それをどこかに貼り付けて、「ベースから派生する必要があります」という素晴らしいエラーメッセージを取得します

テンプレートでは、テンプレート システムが複雑で高度な (より多くのことができる) ため、「T extends B」を指定する方法はありません。メソッド名が抜けていることを伝えていないように見えるメソッド名が抜けている場合のエラー。

于 2013-11-14T18:45:54.703 に答える
-1

A、B、および Container クラスの宣言は有効であり、この目的のために機能します。次の構文はエラーの原因です。

B *b = new B();
Container<A> *aContainer = new aContainer<B>(b);

まず、クラスのコンストラクターを でnew使用する場合、オブジェクトの名前ではなく、(Java のように) クラス名を使用する必要があります。継承の側面に関しては、コンテナーは として宣言されているため、 B が A から継承されていても、Container<A>として構築することはできません。オブジェクトに型とコンストラクターを使用すると、 A オブジェクトまたは B オブジェクトのいずれかを含めることができます。あなたがやろうとしていると思います。したがって、コードは次のようになります。Container<B>Container<A>aContainer

B *b = new B();
Container<A> *aContainer = new Container<A>(b);

それはコンパイルされ、あなたのために働くはずです。それがあなたのやりたいことに合わない場合は、遠慮なく説明してください。しかし、それが役立つことを願っています!

于 2013-11-14T18:51:53.480 に答える