The introduction of templates to C++ brought a new paradigm to C++ coding — Generic Programming. This is now a major part of the toolkit of the C++ programmer, the basis of much of the standard library, and something which many of us younger C++ hackers never experienced C++ without. Generic Programming is often discussed in contrast with Object Orientated Programming’s concept of inheritance. How
イテレータ(iterator)は C++ STL(Standard Template Library)の中核を成す概念のひとつで、ポインタの機能を抽象化したものである。 参照外し(dereference)、インクリメント・デクリメント、比較などのポインタ同等の機能を持つ。 STLの各コンテナには、それ専用のイテレータクラスが定義されており、 イテレータオブジェクトの生成はコンテナの begin(), end() メソッドなどで行う。 コンテナの最大要素を取得する例: vector<int> cntn; ..... // cntn にデータを格納する処理 int val = MIN_INT; for(vector<int>::iterator itr = cntn.begin(); itr != cntn.end(); ++itr) val = max(val, *itr); イテレータは、
C++でどこまでヒープに確保されるのかが分からなくなる場合があります。 特に、配列がある場合や、クラスを使う場合newしてインスタンス作って使用する場合と、 そうでない場合があり、どこまでヒープ領域に確保されているのか 分からなくなってしまっています。 (開発環境 Visual Studio 2013等) Q1 クラス内の配列 class AA{ public: int x; int dat[10]; }; AA *a0 = new AA(); とする場合と AA a1; とする場合。 このとき、メンバ変数はそれぞれ、 a0->xはヒープ領域に確保 a1.xはスタック領域に確保 されるという理解で良いですか? そして、配列a0->dat[0]等 もヒープ領域に確保されていますか? Q2 クラス内にクラス class BB{ int u,v; AA aa; }; BB *b0 = new B
2017/05/14 · STL コンテナを public 継承した場合には、特に何もしなくても親クラスのイテレータがそのまま使えるので拡張 for 文が使えます。ただし、 STL コンテナの ...
class Info // 情報クラス. { public: // データの設定. void SetData (int a) { data = a; } // データの取得. Info GetData () { return data; } private: int data; // なんかのデータ. }; class InfoManager // 情報管理クラス { public: // 情報の取得. Info GetInfo (int index) { return datas[index]; } // 情報の追加. void AddInfo (Info a) { datas.push_back(a); } // 情報の数. int GetCount () { return (int)datas.size(); } private: std::vector<Info> datas; /
このEmptyClassのサイズはいくつでしょうか? Emptyという位なのでゼロなのかと思いきや、sizeofで計るとゼロ以外の数値になります。 Wandboxで見てみましょう。 sizeof(Empty) = 1ですね。 なぜか?その答えはある名曲に隠されています。 言葉はいつも奥の方から後ろに虚しさ連れて教えてくれた けれどこんなにもからっぽになったのに僕は歩き出した __ゆず「からっぽ」 からっぽに見えても、みんな何かを抱えて生きているのです。ゼロなんてありえないんですね。C++のクラスも同じなんですね。 納得感を得たところで、改めて言うと、C++の型は全くデータメンバが無い状態でも単独でインスタンスが作られる場合必ずサイズを持ちます。 C++のテクニカルな理由で、「空のクラス」でも、「独立したオブジェクト」のサイズは0にできないのです。 __Effective C++ 第3版 「
JavaというかAndroidとかでListenerを使うような場合、C++ではhas-a継承が使える。 まず、一々記述するのが面倒なのでlistenされる側をlisteneeと呼ぶことにする。 listenerを使うのは(listen)erが(listen)eeから何かイベントを受け取りたい場合だ。ここで、イベントを通知するメソッドをeeに純粋仮想関数として定義して、これをerが継承する。erでは通知メソッドを実装しなければならないし、当然イベントがあればerの通知メソッドが呼ばれる。 Listenerはeeからerの何かを呼ぼうとするとeeがerの実装に依存してしまうという逆依存問題を解消する方法でもあるが、この方法でもeeはerに依存していない。listenerの登録だのがクラスの構造に固定化されているのでlistenerの煩雑さもない。 これがhas-a継承が便利な場合。Javaだ
継承 内容 継承とは メンバの追加 派生クラスでのメンバ関数の再定義 基底クラスのメンバ関数呼び出し コンストラクタとイニシャライザ 継承とは プログラムを作成していると、これから実装したい機能と似たようなコードを別の場所で書いていたな・・・ということが起こります。 こういった場合の対応としてビギナープログラマにありがちなのは、その似たようなコードをコピーしてきて、必要な部分を修正して使うという方法です。このような方法を繰り返していると、やがてプログラムが似たようなコードで埋め尽くされて、コード量が増加してきます。 それだけならばまだ良いのですが、ここでもしもコピー元のコードにバグが含まれていたとしましょう。これを修正するのに、プログラム中にちりばめられたコピーコードのすべてを修正する必要が出てきます。 こういった状況に懲りたビギナーを卒業したプログラマは、もとのコードをコピーして使用する
先日、後輩より、std:vectorを継承したクラスについて注意をうけまして、 まぁ、何となくイマイチなコードだとは思ってたんですが、 マズイ点を指摘されたので、メモしておきたいと思います。 ちなみに、この後輩、using namespaceは使わないほうがよいらしいという指摘をした人と同一人物です。 こういう後輩がいると、ありがたいです(勉強になります)ね。 class ClassA : public std::vector<std::wstring> { : } としてるときに、 std::vector<std::wstring> *v = new ClassA(); delete v; とすると、ClassAのデストラクタが呼び出されないらしいです。 理由としては、 std::vectorのデストラクタは、仮想デストラクタではない(virtual)からだそうです。 デストラクタは、無
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く