「オブジェクト」オブジェクトのポインタを保持するSTLリストに苦労しています。
私は宣言しました:
list<Object*> objectlist;
および挿入:
this->objectlist.Push_back(new Object(address,value,profit));
地図などのように繰り返してみました。
list<Object*>::iterator iter;
iter = this->objectlist.begin();
while(iter != this->objectlist.end())
{
iter->print();
}
Print()はクラスObjectのパブリックメソッドです。
ここで何が問題なのですか?
リスト内のオブジェクトにイテレータ経由でアクセスできませんか?
(*iter)->print();
が必要です
ポインタへのイテレータがあるため、最初にイテレータを逆参照する必要があり(これにより、Object*
が取得されます)、次に矢印がObject *
を逆参照し、呼び出しを印刷できるようにします。
イテレータをインクリメントしていません! while
ループを次のようにfor
ループに変更します。
for (list<Object*>::const_iterator iter = this->objectlist.begin(),
end = this->objectlist.end();
iter != end;
++iter)
{
(*iter)->print();
}
(また、他の回答が指摘しているように、iter
dereferencesポインタへ。)
* iterを使用してイテレータが指す値にアクセスできます
また、反復ごとにイテレータをインクリメントすることを忘れないでください。そうしないと、無限ループに陥ります。
このような:
iter = this->objectlist.begin();
while(iter != this->objectlist.end())
{
(*iter)->print();
iter++;
}
C++ 11の方法を試すことができます(可能な場合)。イテレータの間接参照は無料です:)
for (auto& iter: this->objectlist)
{
iter->print();
}
また、print()がconst関数である場合は、使用する必要があります
for (const auto& iter: this->objectlist)
for
-ループの代わりに、STLのfor_each()
を使用する必要があります-単純なfor
-ループよりも for_eachの利点 を参照してください。
_#include <algorithm> // 'for_each()' is in there
std::for_each(InputIterator first, // Iterator start position
InputIterator last, // Iterator end position
Function fn); // Unary function - executed on all elements in range
_
for_each
_例例はstd::for_each()
ではなくfor( ... )
のようになります。
_list<Object*> objectlist;
// insert some elements …
// Deletes all elements of 'objectlist'
std::for_each(objectlist.begin(), objectlist.end(), DeleteObj<Object*>());
_
単項関数はテンプレートを使用して実装されるため、anyタイプで使用できます。 T
がポインタ型であることを確認してください!
_template<class T> class DeleteObj
{
public:
bool operator()(T obj) const
{
delete obj;
return true;
}
};
_
ところで。これをテンプレートとして実装する必要はありません。そして:そのような実装の代わりにメンバー関数をバインドすることもできます!
次の方法を使用する必要があります。
(*iter)->print()
イテレータはリスト内の要素を参照するため、タイプT
のリストの場合、イテレータを逆参照すると、タイプT
の値が生成されます。
あなたの場合、T
は実際にはポインタです-Object*
。従って iter->
call(イテレータを逆参照する)はポインタを生成します。 actualaオブジェクトに到達するには、そのポインターを逆参照する必要があります。
使ってみてください
(*iter)->print()
代わりに。