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;
}


そういやエラー処理とかしてないな…まぁいいか。
どうせ実際に使う訳じゃないし。