C++

virtualキーワードについて

C++

@natsutan さんが C++で、派生関数をオーバーライドする時は基底クラスを virtual にする必要がある。mjd! JavaもPythonも、そんなのいらねーじゃん。2011-02-03 15:43:07 via Tweenと言っておられたので、そういえば、なんで明示的にvirtualを指定させるん…

今日もg++に完敗

C++

下記のようなコード #include <iostream> class A { public: A() {}; virtual ~A() {}; virtual void hoge(); }; class B : public A { public: B() {} ~B() {} void hoge(); }; void B::hoge() {} int main(int argc, char** argv) { A* a = new B(); return 0; } を</iostream>…

実体を返してハマった話

C++

最近、ブログに書くネタが特にないほど枯れた生活を送ってましたが、久しぶりにつまらないところでハマったので、書いてみることに。ソースのイメージは下記の通り。class Bの中でclass Aのオブジェクトを複数保持するため、std::vectorで保持している。 #in…

文字列が化ける2

C++

この続きです。 http://d.hatena.ne.jp/yukichanko/20100608/1275971551 std::stringからchar*にしたら、とりあえず変な挙動は示さなくなったのだけど、やっぱり気持ち悪くてしょうがないので、もう少しだけ調べてみた。 gitからソースを取り出して、コンパ…

共有ライブラリが読み込めない

http://d.hatena.ne.jp/yukichanko/20100608/1275971551 この続き。 日を変えて、再度実行したら、やはり文字列が化けてしまったので、Macから別環境(会社のLinuxサーバー)に移して再現実験をしてみることにした。 Linuxで実行すると、Segmentation Faultで…

文字列が化ける

C++

この辺り、ちゃんとC/C++の文字列を理解していないのが問題だが、下記のような文字列をログファイルに出力する関数を作った場合、 void Common::out_log(FILE* log, const std::string& mes) { fprintf(log, "%s", mes.c_str()); } コレとは関係ない文字列が…

各種データ構造のMessagePackのよるシリアライズ/デシリアライズ化

C++

本来の使い方とは違う気がしてるけど、C++オブジェクトのシリアライズ化にMessagePackを検討中。 その際に、ポインタ型、参照型、enum型のシリアライズ/デシリアライズの方法をテストコードで検証したので、備忘録がてら、さらしておく。 ポインタ型 http://…

コンストラクタから間接的に純粋仮想関数を呼べない

C++

C++を使っていると、結構頭にクエスチョンがわくことが多い。おそらく、私がC++を深く理解出来ていないからだろうけど。今回は、コンストラクタから間接的に純粋仮想関数を呼んだ場合の話。 #include <iostream> class Base { public: Base(){ caller(); } void caller</iostream>…

virtualキーワード

C++

今までvirtualキーワードの意味を勘違いしていたらしい。たとえば、このようなコードがある場合、 #include <iostream> #include <string> class Base { public: Base() {} const char* name() { return "Base"; } }; class Child : public Base { public: Child() : Base() {}</string></iostream>…

Polymorphism

C++

実は理解しているつもりが、してないような気もしてるので少し練習。 #include <iostream> #include <string> class Base { public: virtual void say_name() { std::cout << "オレを呼ぶな" << std::endl; } }; class Circle : public Base { public: void say_name() { std::</string></iostream>…

テンプレート使用時の分割コンパイルの方法

C++

汎用的な関数を定義したいときに、複数の型で使えるようにコードを大量にコピペするのは、愚の骨頂なので、C++にはテンプレート関数と言う機能が備わっています。 そのテンプレート関数(おそらくクラスでも同じ問題が出るであろう)を分割コンパイルするとき…

g++とgccの違い

C++

Leopardで空きメモリの量を知りたいと思って、 http://d.hatena.ne.jp/Christopher-727/20071110 を参考に(というか、そのままコピー)、下記のようなコードを書いてみる。 // 空きメモリ量を標準出力に表示する #include <mach/mach_init.h> #include <mach/host_info.h> #include <stdio.h> int main(int </stdio.h></mach/host_info.h></mach/mach_init.h>…

事始め

そこそこC++になじんできたので、流行遅れのTBBに手を出してみた。 簡単なfor文を作って、それをparallel_forに書き換えて、テストを実行。マシンは、Macbook Airなので、Core2 Duo Sequential 5.97237 sec TBB 4.97846 sec ??? あんま変わんないなぁ。こん…

どう書く?

C++

最近、Cと戯れている時間が多くなったので、自然とポインタを使ってしまうのだけど、世間ではポインタをどうやって宣言しているのだろう? たいていのサンプルだと、 int *hoge_p; と書かれている。でも、これだと少なくともボクにはよくわからないところが…

メソッドのオーバーライド

C++

Perlのようなご気楽言語でプログラムしてたので、C++の言語仕様がものすごく変に感じる。 そもそも、最近の言語だと、親クラスを継承した時に同じメソッドの定義があると、勝手にオーバーライドしてくれるので、それが当たり前だと思ってたんだけど、C++の場…

Cannot appear constant-expression?

C++

超不慣れなC++と戯れていて、プログラム全体で使用する定数をConstantクラスとして、クラス化してるんだけど、次のような書き方をするとErrorになる。 class Constant { public: static const double PI = 3.14159; static const double permeability = 4.0 …