c++でStrategyパターンってこんな感じ?
とある面接で「デザインパターンちゃんと理解して無いよね」と指摘されたので勉強中。得意な言語だと意味が無いとなぜか思い込んでしまいc++で勉強中。
ちなみにさくらで書いているのですが、正しいダイジェストが取れません。何かバグってるのでしょうけどデザインパターンの勉強と割り切って見ない振りをしています。
#include <iostream> #include <string> #include <map> #include "openssl/md5.h" #include "openssl/sha.h" typedef unsigned int u_int; using std::cout; using std::cerr; using std::endl; using std::string; struct HashPtn { virtual string get_hash( string s ) = 0; }; struct MD5_hash : public HashPtn { virtual string get_hash ( string s ) { unsigned char digest[MD5_DIGEST_LENGTH]; MD5_CTX ctx; MD5_Init(&ctx); MD5_Update(&ctx, reinterpret_cast<const unsigned char *>(s.c_str()), s.length()); MD5_Final(digest, &ctx); string ret = reinterpret_cast<char *>(digest); return ret; } }; struct SHA1_hash : public HashPtn { virtual string get_hash ( string s ) { unsigned char digest[SHA_DIGEST_LENGTH]; SHA_CTX ctx; SHA1_Init(&ctx); SHA1_Update(&ctx, reinterpret_cast<const unsigned char *>(s.c_str()), s.length()); SHA1_Final(digest, &ctx); string ret = reinterpret_cast<char *>(digest); return ret; } }; struct Hash { HashPtn * m_strategy ; Hash( HashPtn * in_strategy ) { m_strategy = in_strategy ; } string get_hash_( string s ) { return m_strategy->get_hash( s ); } } ; int main() { MD5_hash md5; Hash h( &md5 ); cerr << h.get_hash_( "hoge" ) << endl; return 0; } g++ -g -O2 -Wall -ggdb -pg -I. my_hash.cc -o my_hash -lm -lstdc++ -lcrypto -lssl