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>…
基本は、例外が起こりそうな場合のロジックを try ブロックで囲んでおく。 その後、例外処理させたい処理を catch ブロックに記述する。 気をつけないといけないのは、 catch が無い場合、プログラムはどこにエラーを吐いていいのかわからず、異常終了する場…
こんなややこしいポインタを使う時があるのか疑問ですがメモw weak pointerの特徴まとめ shared_ptrから必ず生成される 使用カウントはインクリメントもデクリメントもされない 所持関係を持たない 複雑な参照サイクル時にオブジェクトが削除されなくなって…
Shared Pointerの特徴です。 heap内の同じオブジェクトを参照できる assignやmoveをすることができる arrayの管理はdefaultではできない use countが0になった時点でobjectは破棄される 宣言 { std::shared_ptr<int> p1 {new int{100}}; std::cout << *p1 << std:</int>…
Smart Pointerには4つ種類があるらしい。 1. Unique Pointer 2. Shared Pointer 3. Weak Pointer 4. Auto Pointer まずはUnique Pointerから! 原則、今までやっていたように、新しくobjを作ったときに'delete'が必要ないです。 スコープを抜けた際に自動でh…
ルール InterfaceクラスはPure virtual functionしか持てない 上記pure virtual functionは必ずpublicで宣言すること C++にはInterfaceとして定義する構文は無い そのためabstractクラスとpure virtual functionでinterfaceを実装する 使い方 Base classから…
使用するのは、Baseクラスにどんなロジックを実装したらいいのかわからないような時。 Concreteクラスには、必ずロジックを実装する必要がある。 Derivedは、必ずBaseクラスをoverrideすること。そうでないとderivedクラスもabstractになってしまう。 virtua…
ベースClassのリファレンスに派生クラスをつっこむと、派生クラスの中を参照することができる、ということだ! #include <iostream> class Base { public: virtual void say_hello() const{ std::cout << "this is Base class object" << std::endl; } virtual void sa</iostream>…
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>…
さて、誰も見ていないが前回の問題を解決するコードは下記だ!! #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>…
いつも何らかの言語を学ぶと継承らへんで止まってたんですが、、 今度こそは違うぞ!ポリモーフィズムやでえ! まず、ポリモーフィズムはとは、なんですか? これは下記リンク参(ry capm-network.com 引用すると、 ポリモーフィズムとは、メソッドに複数の…
下記のようなコードの場合、 Derivedオブジェクトに渡されたintの値である1000は、 Base(int x)である、"base int overloaded constructor"が最初に実行される。 Derivedクラスにはintを引数としたコンストラクタが無いので、 Baseクラスのvalueは1000の値に…
まーーーーたconstructor と destructorのお話ですわ 継承したクラスからconstructorやdestructorをcallする場合、順序が面白いことになるので、 そこをサクッとメモです。 Class Base 1. Constructor 2. Destructor Class Derived : Bass 3. Constructor 4.…
さーてようやくinheritanceまできました!(またサボってました) inheritanceのやり方は、下記です。 class Account { //functions, members } class Saving_Account ; public Account { //functions, members } class Checking_Account ; public Account {…
おいおい、ちょっと待って!オペレーターまでOverloadできんの!? 全く知りませんでした。 頻繁にそういう自作のオペレーターで色々するのなら、役に立つのかな、、、 まあ、つべこべ考えずにまずはコード。 クラスのMember内でオーバーロード sample.h cla…
C++はアサインメントのオペレータでさえ、オーバーロードできるんですね。。。 これ使う時がどんなときなのかというと、Shallow copyではなく、Deep copyが必要なとき。 (クラスのメンバにRawポインタがいる場合。デフォルトだとshallow copyになってしまう…
なんかこれはメモっておいたほうがよいと思ったのでメモ! Testクラスに、char *strというメンバ変数が存在する場合です。 #include <cstring> #include <XXX.h> //XXX.hがローカルにあることを前提 //no args constructor Test::Test() //nullptrで初期化 : str{nullptr} { </xxx.h></cstring>…
コンストラクタからようやく解放!(たぶん) というわけで、最後のMoveコンストラクタですが これはDeep Copyをせずにソースのオブジェクトをコピーせずに値を移動させちゃうようなコンストラクタです 基本的には、r-valueに対して有効と認識しています。(…
Deep Copying / Shallow Copying があるようです。 Shallow copyでCopy Constructorを使用した場合、ポインタを用いているとメモリ破壊が起こることがあります。 要は、Deep Copyingだとcopyされた変数のアドレスを別に保持します! class Shallow { private…
Copyコンストラクタの必要性がいまいちわかっていない。。。 クラスのメンバ達の値を新しいオブジェクトにコピーするって感じで合ってるのやら。。 とりあえず、Copyコンスラクタの定義です。 class Sample { private: char a {"wawawa"}; char b; char c; p…
コンストラクターにも色々ありまして、、、 前回メモしたコンストラクタは、実はちゃんと初期化しているのか!?と言われるとそうでもない、と。 ただ値をアサインしているだけとも言える。 そのため、initialization listをメモ。これはコードも減らせるし…
ほいほい、ついにコンストラクタとデストラクタ 簡単にいうとクラス内メンバの初期化を行ってくれる素晴らしいやつ。 種類があります 1. デフォルトコンストラクタ 2. ユーザー仕様のコンストラクタ 下記例は、2です。1を使う場合、クラス内にコンストラクタ…
さてさてGWは完全にサボってました。totally slacked off メーン! というわけで、再開していきます。 C++のコードってなんでhoge.hとか、hoge.cppとかに分かれているのかな〜ってのがようやくわかりました! たとえば、accout.hというaccountクラスの定義に…
さてさて、クラスに定義したメンバーのアクセスはどうするんでしょうか! Dotをつかう すでにオブジェクトがある場合、 Sample omanman; omanman.peropero; omanman.punipuni(69); *peropero変数とint型の引き数をもつpunipuni関数がSampleクラスにある場合…
さて、ようやくオブジェクト指向。 普段が化石言語なもので、なんかい学んでも忘れますが今回こそは/// クラス定義 class Sample { //atributes int int_sp; double double_sp; string st; // functions void print_int(int); void print_db(double); voi…
普通に変数の値を関数に渡す 関数が実際に渡された変数の値を変えないことが前提 そして渡す変数が比較的軽くてシンプルなもの(int, char, double, boolなど) ポインターを使って変数の値を関数に渡す 関数が実際に渡された変数の値を変えることが前提 渡…
type *function() と関数を定義すれば、C++でポインターを関数からreturnさせることが可能です。 int *sample_function( int *ptr1, int *ptr2) { if *ptr1 < *ptr2 return ptr1; else return ptr2; } みたいな感じです。 やっちゃいけないこと これ重要と思…
なんか変なタイトルになってしまいましたが、 C++はポインタに++したり--したりしていて意味不明すぎるので、 よくあるやつですよってことで 例をメモしておく。 例1 int main() { int array[] {1,2,3,4,5,-1}; int int_ptr {array}; // int_ptrの値が-1にな…
arrayとpointerの関係は面白い。 面白いけどかなり混乱を招くので、メモしておく。 簡単に復習すると、array変数の名前に関しては配列の一番最初のアドレスを保持している。 ポインタ変数に関してはアドレス値を保持しているため、 array変数とarray変数を参…
たまに、どれだけのサイズを確保したらいいのか動作させるまで、わからない場合がある そんなときは変数サイズを動作時に確保してしまえばよいということである。 わかりやすい例が下記のコード size_t size{0}; double tmp_ptr {nullptr}; //ユーザーに変数…