したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

管理人の独り言(プログラミング関連)

2461774さん:2010/07/21(水) 01:20:32
3986 :774さん:2010/07/21(水) 01:01:32
std::for_each(ls.begin(), ls.end(), [](std::unique_ptr<ITest> &p){
p->Show();
});
ん・・・。
これは普通にiteratorで書いたほうがいいか・・・

3987 :774さん:2010/07/21(水) 01:14:54
ちゃんとlist::eraseで消しても、デストラクタが呼ばれるし、他のイテレータも有効だなあ。
イテレータの件については標準なのか調べてみる。明日、テストだし寝る。
-----
#include <iostream>
#include <windows.h>
#include <list>
#include <memory>
#include <algorithm>

#define nullptr NULL

class ITest{
public:
virtual auto Show()->void = 0;
virtual auto IsEven()->bool = 0;
virtual ~ITest(){
}
};

class CTest1 : public ITest{
private:
int m_num;

public:
CTest1(int num)
: m_num(num)
{
std::cout << "CTest1::CTest1(int)" << std::endl;
}
virtual ~CTest1(){
std::cout << "CTest1::~CTest1(), m_num = " << m_num << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest1::Show(), m_num = " << m_num << std::endl;
}
virtual auto IsEven()->bool{
return !static_cast<bool>(m_num & 1);
}
};
class CTest2 : public ITest{
private:
double m_num;

public:
CTest2(double num)
: m_num(num)
{
std::cout << "CTest2::CTest2(double)" << std::endl;
}
virtual ~CTest2(){
std::cout << "CTest2::~CTest2(), m_num = " << m_num << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest2::Show(), m_num = " << m_num << std::endl;
}
virtual auto IsEven()->bool{
return !static_cast<bool>(static_cast<int>(m_num) & 1);
}
};

auto WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int /*nCmdShow*/)->int{
std::list<std::unique_ptr<ITest>> ls;
for(int i = 0; i < 10; ++i){
ls.emplace_back(new CTest1(i));
ls.emplace_back(new CTest2(static_cast<double>(i)));
}

for(auto itn = ls.begin(), it = itn++ , end = ls.end(); it != end; it = itn, ++itn){
if((*it)->IsEven()){
ls.erase(it);
}
}

return 0;
}

3988 :774さん:2010/07/21(水) 01:17:09
g++ main.cpp -std=c++0x -O3 -lwinmm -m32


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板