' P '

whatever I will forget

C++

C++ 例外処理 クラス

C++

例外処理をクラスで行うことも可能。 #include <iostream> class value_can_not_zero { }; class value_can_not_be_minus{ }; double calculate_km_per_liter (int km, int liter){ if (km == 0) { throw value_can_not_zero(); } if (km < 0 || liter < 0){ throw val</iostream>…

C++ 例外処理の基本

C++

基本は、例外が起こりそうな場合のロジックを try ブロックで囲んでおく。 その後、例外処理させたい処理を catch ブロックに記述する。 気をつけないといけないのは、 catch が無い場合、プログラムはどこにエラーを吐いていいのかわからず、異常終了する場…

C++ Smart Pointer - Weak Pointer

C++

こんなややこしいポインタを使う時があるのか疑問ですがメモw weak pointerの特徴まとめ shared_ptrから必ず生成される 使用カウントはインクリメントもデクリメントもされない 所持関係を持たない 複雑な参照サイクル時にオブジェクトが削除されなくなって…

C++ Smart Pointer - Shared Pointer

C++

Shared Pointerの特徴です。 heap内の同じオブジェクトを参照できる assignやmoveをすることができる arrayの管理はdefaultではできない use countが0になった時点でobjectは破棄される 宣言 { std::shared_ptr<int> p1 {new int{100}}; std::cout << *p1 << std:</int>…

C++ Smart Pointer

C++

Smart Pointerには4つ種類があるらしい。 1. Unique Pointer 2. Shared Pointer 3. Weak Pointer 4. Auto Pointer まずはUnique Pointerから! 原則、今までやっていたように、新しくobjを作ったときに'delete'が必要ないです。 スコープを抜けた際に自動でh…

C++ Polymorphism Interfaceとしてabstract classを使う

C++

ルール InterfaceクラスはPure virtual functionしか持てない 上記pure virtual functionは必ずpublicで宣言すること C++にはInterfaceとして定義する構文は無い そのためabstractクラスとpure virtual functionでinterfaceを実装する 使い方 Base classから…

C++ Polymorphism virtual function and abstract class

C++

使用するのは、Baseクラスにどんなロジックを実装したらいいのかわからないような時。 Concreteクラスには、必ずロジックを実装する必要がある。 Derivedは、必ずBaseクラスをoverrideすること。そうでないとderivedクラスもabstractになってしまう。 virtua…

C++ Polymorphsim using Base class reference

C++

ベースClassのリファレンスに派生クラスをつっこむと、派生クラスの中を参照することができる、ということだ! #include <iostream> class Base { public: virtual void say_hello() const{ std::cout << "this is Base class object" << std::endl; } virtual void sa</iostream>…

C++ Polymorphism Override specifier

C++

Oops!関数をoverrideしようとしたらミスってた! #include <iostream> class Base { public: virtual void say_hello() const{ std::cout << "this is Base class object" << std::endl; } virtual ~Base() {}; }; class Derived: public Base { public: virtual void</iostream>…

C++ Polymorphism Virtual function and destructor

C++

さて、誰も見ていないが前回の問題を解決するコードは下記だ!! #include <iostream> class Base { public: virtual void say_hello() const { std::cout << "this is Base class object" << std::endl; } virtual ~Base() {std::cout << "Base Destrcutor is called" </iostream>…

C++ Polymorphism 概念

C++

いつも何らかの言語を学ぶと継承らへんで止まってたんですが、、 今度こそは違うぞ!ポリモーフィズムやでえ! まず、ポリモーフィズムはとは、なんですか? これは下記リンク参(ry capm-network.com 引用すると、 ポリモーフィズムとは、メソッドに複数の…

C++ 継承元クラスに引数を渡す場合

C++

下記のようなコードの場合、 Derivedオブジェクトに渡されたintの値である1000は、 Base(int x)である、"base int overloaded constructor"が最初に実行される。 Derivedクラスにはintを引数としたコンストラクタが無いので、 Baseクラスのvalueは1000の値に…

C++ Inheritance constructor / destructor

C++

まーーーーたconstructor と destructorのお話ですわ 継承したクラスからconstructorやdestructorをcallする場合、順序が面白いことになるので、 そこをサクッとメモです。 Class Base 1. Constructor 2. Destructor Class Derived : Bass 3. Constructor 4.…

C++ Inheritance

C++

さーてようやくinheritanceまできました!(またサボってました) inheritanceのやり方は、下記です。 class Account { //functions, members } class Saving_Account ; public Account { //functions, members } class Checking_Account ; public Account {…

C++ Overloading Operator

C++

おいおい、ちょっと待って!オペレーターまでOverloadできんの!? 全く知りませんでした。 頻繁にそういう自作のオペレーターで色々するのなら、役に立つのかな、、、 まあ、つべこべ考えずにまずはコード。 クラスのMember内でオーバーロード sample.h cla…

C++ Overloading assignment operator

C++

C++はアサインメントのオペレータでさえ、オーバーロードできるんですね。。。 これ使う時がどんなときなのかというと、Shallow copyではなく、Deep copyが必要なとき。 (クラスのメンバにRawポインタがいる場合。デフォルトだとshallow copyになってしまう…

C++ <cstring>を使うメンバ変数が存在する場合のコンストラクタ定義

C++

なんかこれはメモっておいたほうがよいと思ったのでメモ! Testクラスに、char *strというメンバ変数が存在する場合です。 #include <cstring> #include <XXX.h> //XXX.hがローカルにあることを前提 //no args constructor Test::Test() //nullptrで初期化 : str{nullptr} { </xxx.h></cstring>…

C++ Move Constructor

C++

コンストラクタからようやく解放!(たぶん) というわけで、最後のMoveコンストラクタですが これはDeep Copyをせずにソースのオブジェクトをコピーせずに値を移動させちゃうようなコンストラクタです 基本的には、r-valueに対して有効と認識しています。(…

C++ Deep Copying with copy constructor

C++

Deep Copying / Shallow Copying があるようです。 Shallow copyでCopy Constructorを使用した場合、ポインタを用いているとメモリ破壊が起こることがあります。 要は、Deep Copyingだとcopyされた変数のアドレスを別に保持します! class Shallow { private…

C++ Copy Constructor

C++

Copyコンストラクタの必要性がいまいちわかっていない。。。 クラスのメンバ達の値を新しいオブジェクトにコピーするって感じで合ってるのやら。。 とりあえず、Copyコンスラクタの定義です。 class Sample { private: char a {"wawawa"}; char b; char c; p…

C++ Constructor Initialization List, Delegating constructor

C++

コンストラクターにも色々ありまして、、、 前回メモしたコンストラクタは、実はちゃんと初期化しているのか!?と言われるとそうでもない、と。 ただ値をアサインしているだけとも言える。 そのため、initialization listをメモ。これはコードも減らせるし…

C++ Constructor / Destructor

C++

ほいほい、ついにコンストラクタとデストラクタ 簡単にいうとクラス内メンバの初期化を行ってくれる素晴らしいやつ。 種類があります 1. デフォルトコンストラクタ 2. ユーザー仕様のコンストラクタ 下記例は、2です。1を使う場合、クラス内にコンストラクタ…

C++ メンバーメソッドの実装

C++

さてさてGWは完全にサボってました。totally slacked off メーン! というわけで、再開していきます。 C++のコードってなんでhoge.hとか、hoge.cppとかに分かれているのかな〜ってのがようやくわかりました! たとえば、accout.hというaccountクラスの定義に…

C++ クラスメンバーのアクセス

C++

さてさて、クラスに定義したメンバーのアクセスはどうするんでしょうか! Dotをつかう すでにオブジェクトがある場合、 Sample omanman; omanman.peropero; omanman.punipuni(69); *peropero変数とint型の引き数をもつpunipuni関数がSampleクラスにある場合…

C++ クラス定義とオブジェクト生成

C++

さて、ようやくオブジェクト指向。 普段が化石言語なもので、なんかい学んでも忘れますが今回こそは/// クラス定義 class Sample { //atributes int int_sp; double double_sp; string st; // functions void print_int(int); void print_db(double); voi…

C++ いつポインターを使うのか、リファレンスを使うのかの簡単まとめ

C++

普通に変数の値を関数に渡す 関数が実際に渡された変数の値を変えないことが前提 そして渡す変数が比較的軽くてシンプルなもの(int, char, double, boolなど) ポインターを使って変数の値を関数に渡す 関数が実際に渡された変数の値を変えることが前提 渡…

C++ functionからpointerをreturnするとき

C++

type *function() と関数を定義すれば、C++でポインターを関数からreturnさせることが可能です。 int *sample_function( int *ptr1, int *ptr2) { if *ptr1 < *ptr2 return ptr1; else return ptr2; } みたいな感じです。 やっちゃいけないこと これ重要と思…

C++ ポインターの算術

C++

なんか変なタイトルになってしまいましたが、 C++はポインタに++したり--したりしていて意味不明すぎるので、 よくあるやつですよってことで 例をメモしておく。 例1 int main() { int array[] {1,2,3,4,5,-1}; int int_ptr {array}; // int_ptrの値が-1にな…

C++ arrayとpointerの関係

C++

arrayとpointerの関係は面白い。 面白いけどかなり混乱を招くので、メモしておく。 簡単に復習すると、array変数の名前に関しては配列の一番最初のアドレスを保持している。 ポインタ変数に関してはアドレス値を保持しているため、 array変数とarray変数を参…

C++ ポインター Dynamic Memory Allocation

C++

たまに、どれだけのサイズを確保したらいいのか動作させるまで、わからない場合がある そんなときは変数サイズを動作時に確保してしまえばよいということである。 わかりやすい例が下記のコード size_t size{0}; double tmp_ptr {nullptr}; //ユーザーに変数…