nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

C++

C++のコードレビューまとめ

C++のコードレビューのまとめを行います 派生される可能性があるクラスの場合、デストラクタにvirtualをつけよう ポリモーフィズムを利用すべく作った基底クラスのデストラクタはvirtualが必要であるためです。 基底クラスのデストラクタにvirtualを付けない…

template関数でsplit関数を実装する (空白文字列区切り)

C++

template関数でsplit関数を実装する (空白文字列区切り) template関数を使用することで、複数の型を同じ関数で扱うことができるようになります。 使い方 関数呼び出し時には、通常の関数呼び出しとは異なり、型を指定する必要があります。 const std::vector<std::string></std::string>…

Modern_C++_leet文字列変換

C++

#include <string> #include <iostream> #include <map> #include <algorithm> // transform #include <vector> #include <numeric> //iota, accumulate // leetマップ変数 (グローバル変数) std::map<char, char> leet { {'A', '4'}, {'E', '3'}, {'G', '6'}, {'I', '1'}, {'O', '0'}, {'S', '5'}, {'Z', '2'} }; /** * @fn *</char,></numeric></vector></algorithm></map></iostream></string>…

C++で関数型プログラミング (filter関数の実装)

C++

はじめに C++で、関数型プログラミングでいうfilter関数(抽出の処理を行う関数のこと)を使う場合は、以下のテンプレート関数を使うといいです。 copy_if remove_copy_if コード例 以下のコード例では、ラムダ式と挿入イテレータが使用されています。 挿入イ…

抽出・変換・統計をC++テンプレートメソッドで解く [C++]

C++

はじめに 抽出・変換・統計をC++テンプレートメソッドで解きたいと思います。 std::accumulateとラムダ式 C++テンプレートメソッド C++17畳み込み式、単項右畳み込みでコンパイル時に値を計算 #include <iostream> #include <algorithm> //copy_if, for_each, transform #include <vector></vector></algorithm></iostream>…

templateクラスを用いて、C++で抽出・変換・集計処理を行います

C++

はじめに templateクラスを用いて、C++で抽出・変換・集計処理を行います。 #include <iostream> #include <algorithm> //copy_if, for_each, transform #include <vector> #include <array> #include <numeric> //iota, accumulate #include <cassert> using namespace std; void print_num(int num){ std::cout<< </cassert></numeric></array></vector></algorithm></iostream>…

初期化構文 [C++17]

C++

初期化構文 #include <iostream> using namespace std; int main(void){ // Your code here! int test = 2; if (int x = 2; x > test) { std::cout << "xは変数testより大きい" << std::endl; } else if (x == test) { std::cout << "xは変数testと同じ値" << std::end</iostream>…

C++で抽出・変換・集計処理を行う

C++

はじめに JavaやC#の関数型プログラミングをC++で行ってみました。 数列から、奇数を抽出して、その結果に対して2倍し、統計します。 コード #include <iostream> #include <functional> #include <algorithm> #include <vector> #include <numeric> using namespace std; void print_num(int num){ std::cout<<</numeric></vector></algorithm></functional></iostream>…

std::functionについて [C++]

C++

はじめに functionクラステンプレートは、パラメータの型リストArgTypes...、戻り値の型Rに合致する、あらゆる関数ポインタ、関数オブジェクト、メンバ関数ポインタ、メンバ変数ポインタを保持できるクラスです。 使用例 #include <iostream> #include <functional> using namespac</functional></iostream>…

ラムダ式攻略 [C++]

C++

はじめに 「ラムダ式(lambda expressions)」は、簡易的な関数オブジェクトをその場で定義するための機能です。 この機能によって、「高階関数(関数を引数もしくは戻り値とする関数)」をより使いやすくできます。 仕様 構文 [キャプチャリスト](パラメータリ…

コピーコンストラクタと代入演算子の禁止方法

C++

はじめに C++11の文法のdeleteを使うことで、クラスのインスタンスのコピーや代入を禁止することができます。 #include <iostream> class Person { public: // 参照 const std::string m_name; int m_age; Person(const std::string name, int age) : m_name(name), m_</iostream>…

const メンバ変数がいるときの代入演算子

C++

はじめに 自分で作成したクラスのメンバ変数が、constメンバ変数であった場合、デフォルトの代入演算子では正しく代入できません。 そのため、代入演算子を自分で実装します。 例えば、nameとageというメンバ変数があったとしまして、ageだけconstメンバ変数…

メンバイニシャライザ(初期化リスト)[C++]

C++

はじめに メンバイニシャライザ(初期化リスト)を使うと、クラスのメンバ変数を代入ではなく、初期化することができます。 コンストラクタの定義 X::X() : メンバ変数名A(初期化子A), メンバ変数名B(初期化子B), ... { } 厳密には、メンバ変数1つ1つの初…

構造化束縛 [C++17]

C++

構造化束縛 C++17で追加された構造化束縛は多値を分解して受け取るための変数宣言の文法です。 多値を受け取るためには、これまでは多値をかたまりで受け取るか、ライブラリで分解して受け取るしかありませんでした。 構造化束縛を使うと、少ないコード量で…

C++11, C++14, C++17を勉強したい

C++

はじめに C++11, C++14, C++17を勉強するときに役立つサイト、書籍を紹介します。 サイト C++11からC++17を駆け抜けるC++講座 https://qiita.com/yumetodo/items/68f58de43094519ae899 達人出版会 https://tatsu-zine.com/ ここで、書籍を購入すると、Amazon…

整数値をアスキーコードに変換する方法 (_itoa_s関数使用)

C++

はじめに 例えば、124や0x2Fなどの整数値をアスキーコードに変換しようとする場合は、_itoa_sを使うと簡単に変換できます。 関数仕様については、MSDNのドキュメントをご確認ください。 errno_t _itoa_s( int value, char *buffer, size_t sizeInCharacters,…

Google TestをVisual Studio 2017で簡単導入 [C++]

C++

はじめに 以下の記事に方法が書いてあります。 pickles-ochazuke.hatenablog.com

MFCでBitmapファイルを開く(BITMAPINFOHEADER, BITMAPINFOHEADERを取得) [C++][MFC]

C++

はじめに MFCでBitmapファイルを開く方法を下記に記載します。 <使用例> ソースコードファイルの記載は以下のとおりです。クラスではなく、ユーティリティ関数として作成しました。 [BitmapUtil.cpp] #include "stdafx.h" #include "BitmapUtil.h" bool Load…

Google Test導入方法 [VS2017] [Cmake] [C++]

環境について 以下の環境で、Google Testを使用してみます。 Windows 10 Visual Studio 2017 Community Cmake 3.10.2 C++ なお、Visual Studio 2017 バージョン 15.5 以降では、Google Test が C++ ワークロードでのデスクトップ開発の既定のコンポーネント…

マルチバイト文字列(std::string)とワイド文字列(std::wstring)の間の変換を行うライブラリが便利すぎる [C++]

C++

最近、仕事でMFCのアプリケーションをUnicode対応する仕事をしていて、以下のライブラリを使わせていただきました。 マルチバイト文字列(std::string)とワイド文字列(std::wstring)の間の変換を行うライブラリが便利すぎたので、紹介させてください。 本ライ…

無効パラメータハンドラーとセキュア関数でバッファオーバーラン対策 [C++]

C++

はじめに Microsoft Visual Studio Community 2017を使用して、C++コンソールプロジェクトでプログラムを作成しています。 C++警告レベルはデフォルト(レベル3 (/W3))を使用しています。 セキュア関数を使用しないで、strcpy関数で文字列をコピーした場合 以…

C++11 文法について [C++]

C++

以下のページに詳しく書いてあります。 cpprefjp.github.io 範囲for文 型推論 ラムダ式 型alias typedef ⇒ usingを使おう typedefはオワコン 新初期化記法 リストイニシャライザ override

Observerパターンについて [C++]

Observerとは、英語で観察者を意味します。 Observer パターンとは、状態の変化を観察することを目的としたものですが、どちらかというと「観察」よりも「通知」に重点の置かれたものになっています。 あるインスタンスの状態が変化した際に、そのインスタン…

Strategy Patternについて [C++]

はじめに Qiitaに本記事を書き直しました。 Strategyパターン [C#][C++] - Qiita

品質を向上させるために、テストクラスを記載しよう [C++]

C++

このように記載すれば、製品のソースコードと、テストクラスのソースコードを分離できます。 #include "box.h" #include <climits> #include <cassert> #include <iostream> class Test { public: Test() { Run(); } static void Run() { // 正常ケース assert(Test(0,0,0,0)); // 異常ケ</iostream></cassert></climits>…

コードレビューで指摘していただいた箇所まとめ [C++]

C++

コードレビューで指摘していただいた箇所をまとめて記載したいと思います。 ポリモーフィズムのための基底クラスには、仮想デストラクタを宣言すること。なぜならデストラクタが virtual でない場合、親クラスの型のポインタを delete した際には親クラスの…

コードレビューの観点まとめ [C++]

C++

今回は、コードレビューの観点まとめについて、記載していきたいと思います。 <コードレビューでプラス事項> 誰がひきついでもわかりやすく、読みやすいコード 変数名や関数名が工夫されていてコメントが少なく読みやすいコード 変数のスコープが必要最低…

独自クラスをstd::vectorに格納する [C++]

C++

はじめに std::vector に独自クラスを入れる場合、コピーコンストラクタとムーブコンストラクタのいずれかが必要になります。 コピーコンストラクタについては、このページに詳しく書かれています。 http://nobunaga.hatenablog.jp/entry/2016/07/03/230337 …

自作split関数を用いて、標準入力を、読み出す [C++]

C++

プログラムをメモします。 #include <vector> #include <iostream> #define BIG_BUFFERSIZE 1024 using namespace std; template <typename List> void split(const std::string& s, const std::string& delim, List& result) { result.clear(); using string = std::string; string::size_typ</typename></iostream></vector>…