2

私は現在、私のプロジェクトでC++を学んでいます。現在、すべての派生クラスに固有の固有の関数にアクセスしたいので、クラスへのポインターのベクトル(この基本クラスから派生したクラスで埋めます)を使用することを考えています。しかし、それをどのように使用するかは完全にはわかりません。通常のベクトルでの経験から、動作するのがお尻の痛みになる可能性があることを理解しているので、いくつかのことを知りたいだけです。

  1. ベクトルにオブジェクトを追加するにはどうすればよいですか?

  2. ベクトル内の単一の要素を削除するにはどうすればよいですか?

  3. イテレータを介して特定のオブジェクトにアクセスするにはどうすればよいですか?たとえば、ベクトルにポインタがあるオブジェクトの関数にアクセスするにはどうすればよいですか?

  4. オブジェクトへのポインタを引数として取る関数にイテレータを渡すにはどうすればよいですか?

また、他に知っておくべきことはありますか?

4

1 に答える 1

1

セットアップ例、

class Base
{
};

class DerivedOne : public Base
{
};

class DerivedTwo : public Base
{
};

std::vector<Base*> ptrVec;

追加するには、

ptrVec.push_back(new DerivedOne());
ptrVec.push_back(new DerivedTwo());

削除するには、

std::vector<Base*>::iterator it;
/* Make sure it points to the correct element. */
delete *it;
ptrVec.erase(it);

関数へのアクセスは簡単です。

Base* ptrToObj = *it; // Assuming it points to the correct element
ptrToObj->AnyFunc(); // You can also use (*it)->AnyFunc()

4 番目の質問への回答、

AnyFuncThatAcceptsObjPtr(*it); // Again assuming it points to the correct element

また、他に知っておくべきことはありますか?

はい、スマート ポインターについて学びます。

std::vector<SomeSmartPtr<Base> > smartPtrVec;

SomeSmartPtr<Base> smartPtr(new DerivedOne());
smartPtrVec.push_back(smartPtr);

smartPtrVec.erase(it); // With smart pointers, you don't need to delete explicitly
于 2012-09-28T04:27:18.047 に答える