(説明は後述) コードとVC++ のプロジェクトファイルを固めたものへのリンク。
C++ の超有名ライブラリboostに、デフォルトのコピー操作をコンパイル時点でエラーにしてくれるboost::noncopyableという便利クラスがあります。
C++ ではコピー操作(コピーコンストラクタやoperator=)が未定義のクラスでコピー操作を行うと、デフォルトのコピーが働きます。しかしポインタをコピーしてしまうなど、デフォルトのコピーでは困るケースがあります。boost::noncopyableを使うと、気づかないうちに意図しないコピーを使っていないかどうかを、コンパイル段階で検出できるのです。便利でしょ。
前置きが長くなりましたが、私もこれはいいなと思って使ってみたのですが、g++ 4.3.2では何も言われないのに、VC++ 2010だとエラーになってしまい困っています。
私の使い方が何か間違っているだけかもしれませんが、同じコードをコンパイルしてもg++ 4.3.2は何も言いません。しかもVC++ 2010の出すエラーメッセージが意味不明すぎてどこをどう直せばいいのかわからんのです…。
コピーOKなクラスAと、コピーNGな(Uncopyable(※1)を継承)クラスBを多重継承した、クラスCを定義(※2)します。このオブジェクトを例外で投げる(main() のthrow C(); の部分)ということがしたいのです。
その際g++ 4.3.2は何も言わないし、できた実行ファイルも正常に動作もしますが、VC++ 2010は「そんなことはできねーよ!」とお怒りになり、コンパイルエラーにされてしまいます。
A <-----------------+-- C
Uncopyable <-- B <--'
しかし、クラスBを取っ払って、下記のように多重継承したクラスDを使うとVC++ も文句を言わなくなります。
A <-----------------+-- D
Uncopyable <--------'
(※)Uncopyableクラスは、boost::noncopyableのコピペにデバッグメッセージを追加しただけのクラスです。
(※2)コピーOKとコピーNGを多重継承するなんて、コピーOKなのかNGなのか矛盾してますよ、テメーの設計はおかしいですよ。という突っ込みはその通りなのですが、今は設計の話ではないので無視して進めてます。
コードは下記の通りです。先頭の #define USE_CLASS_Cを有効にするとパターン1、コメントアウトなどして無効にするとパターン2となります。
#include <iostream>
#include <cstdio>
//#define USE_CLASS_C
class Uncopyable {
protected:
Uncopyable() {
std::cout << "Uncopyable::Uncopyable()" << std::endl;
}
~Uncopyable() throw() {
std::cout << "Uncopyable::~Uncopyable()" << std::endl;
}
private:
Uncopyable(const Uncopyable&);
const Uncopyable& operator=(const Uncopyable&);
};
class A {
public:
A() {
std::cout << "A::A()" << std::endl;
}
virtual ~A() {
std::cout << "A::~A()" << std::endl;
}
virtual const char *func() {
return "A";
}
};
class B : private Uncopyable {
public:
B() {
std::cout << "B::B()" << std::endl;
}
virtual ~B() {
std::cout << "B::~B()" << std::endl;
}
};
#ifdef USE_CLASS_C
class C : public A, public B {
public:
C() : A(), B() {
std::cout << "C::C()" << std::endl;
}
virtual ~C() {
std::cout << "C::~C()" << std::endl;
}
C(const C& c) : A(), B() {
std::cout << "C::C(const C& c)" << std::endl;
}
virtual const char *func() {
std::cout << "C::func()" << std::endl;
return "C";
}
};
#else
class D : public A, private Uncopyable {
public:
D() : A(), Uncopyable() {
std::cout << "D::D()" << std::endl;
}
virtual ~D() {
std::cout << "D::~D()" << std::endl;
}
D(const D& d) : A(), Uncopyable() {
std::cout << "D::D(const D&)" << std::endl;
}
virtual const char *func() {
std::cout << "D::func()" << std::endl;
return "D";
}
};
#endif
int main(int argc, char *argv[])
{
try {
std::cout << "try0" << std::endl;
#ifdef USE_CLASS_C
throw C();
#else
throw D();
#endif
} catch (A& e) {
std::cout << "catch0" << std::endl;
std::cout << "---- " << e.func() << std::endl;
}
getchar();
}
コピペするのすら面倒くさい方のために、 コードとVC++ のプロジェクトファイルを固めたものを置きます。全コードの著作権は放棄しますが、Uncopyableクラスはboostライブラリboost::noncopyableの派生物です。
コンパイルと実行結果は下記の通りです。
パターン1 VC++(エラー)、g++(OK)、パターン2 VC++(OK)、g++(OK)の順に、コンパイル結果と、実行結果を連続して掲載しています。
まずはUncopyableを直接継承していないパターン(パターン1)です。VC++ の結果です。
1>------ ビルド開始: プロジェクト: noncopyable, 構成: Debug Win32 ------ 1> a.cpp 1>y:\projects\c\test\test_noncopyable\a.cpp(55): error C2248: 'Uncopyable::Uncopyable' : privateメンバー (クラス 'Uncopyable' で宣言されている) にアクセスできません。 1> y:projectsctesttest_noncopyablea.cpp(17) : 'Uncopyable::Uncopyable' の宣言を確認してください。 1> y:projectsctesttest_noncopyablea.cpp(7) : 'Uncopyable' の宣言を確認してください。 1> コンパイラでのこの診断により関数 'B::B(const B &)' が生成されました。 ========== ビルド: 0正常終了、1失敗、0更新不要、0スキップ ==========
次にg++ の結果です。
$ g++ -Wall -DUSE_CLASS_C a.c -o c.out $ ./c.out try0 A::A() Uncopyable::Uncopyable() B::B() C::C() catch0 C::func() ---- C C::~C() B::~B() Uncopyable::~Uncopyable() A::~A()
次、クラスBを継承ツリーから省いてUncopyableを直接継承しているパターン(パターン2)です。VC++ の結果です。
try0 A::A() Uncopyable::Uncopyable() D::D() catch0 D::func() ---- D A::a = 0 D::~D() Uncopyable::~Uncopyable() A::~A()
次にg++ の結果です。
$ g++ -Wall a.c -o d.out $ ./d.out try0 A::A() Uncopyable::Uncopyable() D::D() catch0 D::func() ---- D D::~D() Uncopyable::~Uncopyable() A::~A()
な、なぜだ…。一体、何が間違っているというのだ…。
携帯を毎朝フル充電しているにも関わらず、会社に着くまでには電池残量不足で電源が切れます。
電車内ではiチャネルでニュース見てるだけなんですけど、数ページ見ただけで残量が減っていき、一瞬で電池残量不足になります。全く使い物になりませぬ!
電池パックを取り出して見るとお餅のように丸くなっています。電池パックのあまりの丸さに、裏の蓋もなかなか閉まらないくらいです。こりゃもう寿命だなー。
私がLinux Kernelを読む際は、いわゆるひらメソッドで読み進めています。
ただ、ソースコードの部分はあえてブロックにして区別するなど、書式はかなり変えてます。例えばこんな感じlinux-2.6.33/__EXPORT_SYMBOL()です。
その際に補助ツールとして、以前紹介(2008年2月6日の日記参照)したリンクをバックトレースするプラグイン(#backlinks)と、PukiWikiでブロック表示させるために、ソースコードの行頭にスペースを入れるツールを自作しました。
これでも大きな問題はないのですが、別の関数、シンボルへのリンク作成を手で作るのは面倒くさいし、間違いも起きやすいです。
理想はgtagsのように各関数、シンボルへのリンクは自動で作ってくれることです。それでいて自分のコメントも書き込めるようになっていればGood です。
どこかにそういうツールありませんかね…。
新居の鍵をもらってきました。でもまだ家電が何もない、電灯すらない、のでまだ住めませんけども。
今日は家のマスターキーを2本もらう予定だったのですが、何があったのか1本だけ鍵がひん曲がっていました。
不動産屋さんに曲がってますぜーって言ったら、大家さんのもっているキーと交換してくれるそうです。僕はそれで良いですけど、大家さんは曲がった鍵のままでいいんだろうか?という疑問が沸いたけど、まあ、向こうが良いと言ってるんだから別に良いか。
というわけで今日は鍵1本だけもらって帰りました。ニュー鍵は後日に新居に持ってきてくれるようです。
Windows 7というかVistaくらいからWindowsの起動がとっても遅くなってしまったため、スリープを積極的に使っています。
コールドスタートと比較したらスリープの起動(復旧?)時間はほぼゼロですし、スリープ時の状態が全部復元されますので、とても便利です。今まで使っておらずちょっともったいなかったと思います。
ただ1つ困る点があって、仮想マシンの時計が盛大に狂うのです。
PCはスリープ中も時計が進んでいるので、スリープから復旧しても時計は正しい時刻を指していますが、仮想マシンの場合はスリープ中に時計を進める術がなく、スリープから復旧するとスリープ時の時刻のままです。
時刻を直すのは何も難しいことはなくdateコマンドとかntpで時刻合わせするだけですが、どうも直し忘れます。
忘れたまま作業をする、例えばリポジトリにコミットなんかしちゃうと、平日の昼間やら誰も起きていない深夜やら、訳のわからない時間でコミットログが残ってしまいます。
他人と共同作業をしているなら別ですが、個人利用しているだけなら、多少時計が遅れたところでこれといった害はないです。まあ、あまりにも変な時間になるのでちょっと気になるかな…ってくらいかな?
先日受け取れなかったもう一本のマスターキーを取りに行きました。普通にポストに入っていて、別段おもしろいことはありませんでした。
未だに新居がどこにあるのか良くわかんねーですよ。今日も新居を目の前にして「新居はどこだ?」って地図みながらウロウロしてましたし。
住んでいればそのうち覚えられるだろうと踏んでますが、新居近辺は道が細くて複雑なので、あまり自信ないですな…。
せっかく新居に来たついでに、家の壁や天井の高さを測ってきました。冷蔵庫と洗濯機を買うときのためです。
さらに張り切って、窓のサイズ(カーテン用)やら、流し台のサイズ(コンロ用)なんかも測ってきましたが、そしたらもう汗だく。
外は夜とはいえ、カーテンもなく、窓を締め切った新居はとにかく暑い、の一言に尽きます。
クーラーのない部屋で動き回るのがこれほどつらいとは思いませんでした。クーラーは多少張ってでも、良い奴を買うべき、と決心しました。
新居で使用する生活家電を買いました。友人達とともになんばのLABI1に行きました。
まず絶対必要な家電は、電灯、洗濯機、掃除機、夏到来を考えて、エアコン、冷蔵庫です。時間の都合上、掃除機、電灯は後日にします。
炊飯器、レンジ、ポットなどもいずれ必要でしょうが、後で大下さんの意見を聞いて揃えることにします。
現在の住居はエアコン、電灯備え付けなので、私所有の家電は何一つありません。というわけで上記、全て新規購入です。
エアコン2台と冷蔵庫、洗濯機で、総額にするとものすごい金額になります。友人が値切り倒してくれたおかげで、だいぶ安く手に入り、とても助かりました。大阪では値切るのが当たり前と聞いてはいましたが、徹底していて感心しました。
カードで払いも可能でしたが、ただでさえ低い限度額を一瞬でぶっちぎりそうだったので、ニコニコ現金払いにしました。
現金なら限度額ないから安心だよね!って思っていたら、なんとATMの引き出し限度にぶち当たって金が引き出せなくなりました。「限度額に達しているのでこれ以上取引できません」なんてメッセージ、初めて見たね。
予想外のATM限度額に、友人に金を借りて払うという格好悪い羽目に…。あーあ…。
4年以上使ったN902iSからP-03Bにしました。土曜日に6年使ったと言ってましたが、すまん、ありゃ嘘でした。本当は4年でした。
よく考えたら6年前の2004年にですね、2006年夏モデルである902iSシリーズが買えるわけありません。日記を見直すと、以下が真実のようです。
FOMA時代のまっただ中、相当粘って使っていたmovaを完全に忘れ去っていたあたり、我ながら酷い記憶違いだと思います。いやまあ…そんなこと誰も気にしてないからいいっちゃあいいんですけど。
そういえば携帯電話のLi-ionバッテリーの寿命は2年といいます。機種も容量も違うのに何の根拠があって2年なんだ?と思っていたのですが、私の携帯変遷を見る限り、見事に2年おきに潰れています。つまり次回は2012年ってことね。
大下さんと歌舞伎を見に行きました。
何言ってるか聞き取れなくて寝てしまうのではないか?と心配でしたが、そんなことはなくて面白かったです。全体的に古風な物言いですが、言ってることはわかります。
不安であればイヤホンガイドという解説が流れる無線機を貸してくれます(600円だったかな?)。私は番附という演目のストーリー説明、役者の紹介などをしている冊子(1,500円)を買って、ストーリーの解説を読みながら見ていました。
歌舞伎は大抵が大長編なので一部(今回は9話編成のうち、5, 6, 7, 9話を演じていた)だけ上演されることが多いそうです。全部やったら朝になってしまうので仕方ないところです。
この方法の利点は、長編の中でも特に面白い話、見所のある話だけを上演してくれるので、おいしいとこ取りができることです。難点は突然出てくる人々が一体どういう役柄なのかさっぱりわからない…予習か解説併読が必須、ってことですかね。
もし伝統芸能に興味があるなら、入り口として歌舞伎を選ぶのもありなんじゃないかと思いました。明治で廃れてしまい、今もなお敷居の高さを感じる歌舞伎ですが、江戸時代には派手な演技、独特の踊りで、庶民向けに人気を博した芸能だったようです。
たまに耳鳴りがします。なぜ耳鳴りと断じているかというと、顔を左右に振っても、後ろを向いても、耳をふさいでも同じ方向(左側)から音がするからです。
頻度や間隔はまちまちです。毎日聞こえるわけでもなく一週間くらい何もないときもあるし、たとえ聞こえたとしても数十秒〜長くて1分〜2分です。
聞こえる音は「ピーー」という音です。10kHz〜 のSin波が近い音ですが、微妙に違います。綺麗な耳鳴り…というのも我ながら表現がおかしいと思いますが、とかく鮮明に聞こえます。
昔からこうだったので、あまり気にしていませんが、最近は音のはっきり感が増している気がします。なんか病気なんですかね??
< | 2010 | > | ||||
<< | < | 06 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.20.
using GD bundled (2.1.0 compatible)(png support.)