ページ 1 / 1
std::listの優先順位
Posted: 2016年4月11日(月) 21:26
by 夢幻ノ月夜
今、抽象クラスのポインタのリストを作って簡易的にタスクシステムのようにしているのですが
優先順位が上手く反映されません(常に自機が一番上に来てしまう)
コード:
void Object_Manager::AddTask(CObject *obj){
if(List.empty()){
List.push_front(obj);
return;
}
for(auto itr=List.begin();;itr++){
if(itr == List.end()){
List.push_back(obj);
}
if( *itr < obj){
List.insert(itr,obj);
return;
}
}
}
//operator <の内容
bool operator <(const CObject &obj)const{
return priority < obj.priority;
}
現時点でのコードはこんな感じです
何が間違っているのか教えてください
Re: std::listの優先順位
Posted: 2016年4月11日(月) 22:08
by みけCAT
Listが未定義ですが、タイトルとコードからstd::list<CObject*>と仮定します。
すると、
- objがListの要素でない時、List.end()であるitrをデリファレンスし、無効な値を比較に使用してしまう。
- オブジェクトではなくポインタを比較しているため、ここで提示されているoperator <は利用されない。
という所がやばいでしょう。
改善するには、おそらく
- itr == List.end()だった時、追加した後returnする
- ポインタ同士ではなく、それらが指しているオブジェクト同士を比較するようにする
といいでしょう。
Re: std::listの優先順位
Posted: 2016年4月11日(月) 22:14
by 夢幻ノ月夜
みけCAT さんが書きました:Listが未定義ですが、タイトルとコードからstd::list<CObject*>と仮定します。
すると、
- objがListの要素でない時、List.end()であるitrをデリファレンスし、無効な値を比較に使用してしまう。
- オブジェクトではなくポインタを比較しているため、ここで提示されているoperator <は利用されない。
という所がやばいでしょう。
改善するには、おそらく
- itr == List.end()だった時、追加した後returnする
- ポインタ同士ではなく、それらが指しているオブジェクト同士を比較するようにする
といいでしょう。
①は分かったのですが、
②のそれらが指しているオブジェクト同士を比較するにはどうしたらいいんでしょうか
*で出来るものなのでしょうか?
Re: std::listの優先順位
Posted: 2016年4月11日(月) 22:54
by みけCAT
夢幻ノ月夜 さんが書きました:①は分かったのですが、
②の
①や②はここでは未定義でしょう。
夢幻ノ月夜 さんが書きました:それらが指しているオブジェクト同士を比較するにはどうしたらいいんでしょうか
オブジェクト同士を比較するコードに修正し、コンパイルし、実行すればいいです。
ポインタに対し単項*演算子を用いるとそのポインタが指しているオブジェクトが得られるので、それを比較しましょう。
Re: std::listの優先順位
Posted: 2016年4月11日(月) 22:56
by 夢幻ノ月夜
みけCAT さんが書きました:夢幻ノ月夜 さんが書きました:①は分かったのですが、
②の
①や②はここでは未定義でしょう。
夢幻ノ月夜 さんが書きました:それらが指しているオブジェクト同士を比較するにはどうしたらいいんでしょうか
オブジェクト同士を比較するコードに修正し、コンパイルし、実行すればいいです。
ポインタに対し単項*演算子を用いるとそのポインタが指しているオブジェクトが得られるので、それを比較しましょう。
コード:
if(*(*itr) < *obj){
List.insert(itr,obj);
return;
}
クソ重くなった挙句順位反映されない(´・ω・`)
やっぱり何かが間違っているのでしょうか
Re: std::listの優先順位
Posted: 2016年4月12日(火) 14:26
by 夢幻ノ月夜
コード:
void Object_Manager::AddTask(CObject *obj){
if(List.empty()){
List.push_front(obj);
return;
}
for(auto itr=List.begin();;){
if((*itr++) < obj){
List.insert(itr,obj);
return;
}
if(itr==List.end()){
List.push_back(obj);
return;
}
}
}
こうしたら上手くいったらしいので解決です
ありがとうございました