C++でお天気取得クラス
本業のやる気が起きないので何となく昨日のをクラス化してみた。
とりあえずint#toStringが欲しいと思った。
LLに慣れた身には型変換とかめんどいんですがー。
COMをここ以外でも使う時はCoInitializeとCoUninitializeは外で呼ぶように変えた方がいいと思う。
// Weather.h #pragma once #import "msxml4.dll" named_guids class Weather { public: Weather(int area); ~Weather(void); private: _bstr_t bstrURL_; MSXML2::IXMLDOMElementPtr pRoot_; public: bool load(); _bstr_t getTitle(); _bstr_t getTelop(); };
// Weather.cpp #include <sstream> #include "Weather.h" Weather::Weather(int area) { CoInitialize(NULL); std::wostringstream oss; oss << L"http://weather.livedoor.com/forecast/webservice/rest/v1?city=" << area << L"&day=tomorrow"; bstrURL_ = oss.str().c_str(); pRoot_ = NULL; } Weather::~Weather(void) { pRoot_.Release(); CoUninitialize(); } bool Weather::load() { MSXML2::IXMLDOMDocument2Ptr pDoc; //ドキュメントオブジェクトのインスタンスを生成する。 if(FAILED(pDoc.CreateInstance(MSXML2::CLSID_DOMDocument))) { return false; } //load関数の非同期処理を切る。 pDoc->put_async(VARIANT_FALSE); //XML読み込み if(!pDoc->load(bstrURL_) != S_OK) { return false; } //ルート要素を取得 if((pRoot_ = pDoc->GetdocumentElement()) == NULL) { return false; } pDoc.Release(); return true; } _bstr_t Weather::getTitle() { return pRoot_->selectNodes(L"/lwws/title")->nextNode()->text; } _bstr_t Weather::getTelop() { return pRoot_->selectNodes(L"/lwws/telop")->nextNode()->text; }
// main.cpp #include <iostream> #include "Weather.h" int main(void) { int area; std::wcout << "天気を取得したい地域番号を入力して下さい(東京:63) : "; std::wcin >> area; Weather w(area); if(!w.load()) { std::cout << "load error." << std::endl; return -1; } std::wcout << w.getTitle() << std::endl; std::wcout << w.getTelop() << std::endl; return 0; }
そういやエラー処理とかしてないな…まぁいいか。
どうせ実際に使う訳じゃないし。